为什么Java在除以0.0时抛出exception?
我有代码来计算两个数字之间的百分比差异 – (oldNum - newNum) / oldNum * 100;
– 这两个数字是double
的。 我预计在oldNum为0的情况下,必须添加某种检查/exception处理。但是,当我对oldNum和newNum执行的值为0.0的testing运行时,执行继续,因为没有发生任何事情,也没有发生错误。 用int
s运行这个代码肯定会导致一个除零算术的exception。 为什么Java在忽略double
s时忽略它?
除以零的结果在math上来说是未定义的 ,可以用浮点数/双精度表示(如NaN
– 不是数字),但从任何基本意义上讲,这并不是错误的。
作为一个整数必须保持一个特定的数值,在处理它们时必须抛出一个被零除的错误。
Java的float
和double
types,就像其他任何语言(几乎任何硬件FP单元)一样,实现了IEEE 754浮点运算标准,该标准强制除零返回一个特殊的“无穷”值。 抛出一个exception实际上违反了这个标准。
整数算术(用Java和大多数其他语言和硬件实现的二进制补码表示)是不同的,没有特殊的无穷大或NaN值,因此抛出exception是一种有用的行为。
double存储的方式与int相当不同。 请参阅http://firstclassthoughts.co.uk/java/traps/java_double_traps.html以获得关于Java如何处理双重计算的更详细的解释。; 您还应该阅读浮点数字,特别是不是数字(NaN)的概念。
如果您有兴趣了解更多关于浮点表示的知识,build议阅读本文档 (Word格式,不好意思)。 它深入到数字的二进制表示,这可能有助于您的理解。
尽pipeJava开发人员知道双原始types和Double
类,但在进行浮点运算时,他们对Double.INFINITY
, NaN
, -0.0
以及其他涉及它们的算术计算的规则没有给予足够的重视。
这个问题的简单答案是它不会抛出ArithmeticException
并返回Double.INFINITY
。 另外,请注意,比较x == Double.NaN
总是计算为false
,即使x
本身是NaN
。
要testingx
是否是NaN
,应该使用方法调用Double.isNaN(x)
来检查给定的数字是否为NaN。 这在SQL
非常接近NULL
。
这可能对你有帮助。
除以零(0或0.00)
-
如果用0除以2,JVM将显示无穷大 。
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
控制台:
Infinity
-
如果用int除以0,则JVM将抛出算术exception 。
public static void main(String [] args){ int a=10; System.out.println(a/0); }
控制台:
Exception in thread "main" java.lang.ArithmeticException: / by zero
-
但是如果我们将int除以0.0,那么JVM将显示Infinity:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
控制台:
Infinity
这是因为JVM会自动键入cast int来加倍,所以我们得到无穷大而不是ArithmeticException。