为什么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的floatdoubletypes,就像其他任何语言(几乎任何硬件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.INFINITYNaN-0.0以及其他涉及它们的算术计算的规则没有给予足够的重视。

这个问题的简单答案是它不会抛出ArithmeticException并返回Double.INFINITY 。 另外,请注意,比较x == Double.NaN总是计算为false ,即使x本身是NaN

要testingx是否是NaN ,应该使用方法调用Double.isNaN(x)来检查给定的数字是否为NaN。 这在SQL非常接近NULL

这可能对你有帮助。

除以零(0或0.00)

  1. 如果用0除以2,JVM将显示无穷大

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }

    控制台: Infinity

  2. 如果用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

  3. 但是如果我们将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。