为什么Java除以0.0时不会抛出异常?

时间:2010-03-04 17:57:45

标签: java types integer double divide-by-zero

我有代码来计算两个数字之间的百分比差异 - (oldNum - newNum) / oldNum * 100; - 其中两个数字都是double s。我希望在oldNum为0的情况下添加某种检查/异常处理。但是,当我为oldNum和newNum进行了值为0.0的测试运行时,执行继续,好像什么都没发生并且没有抛出错误。使用int运行此代码肯定会导致算术除零异常。为什么Java在double s?

时会忽略它

5 个答案:

答案 0 :(得分:110)

Java的floatdouble类型,就像其他任何语言(以及几乎任何硬件FP单元)一样,实现浮点数学的IEEE 754标准,其要求除以零以返回特殊的“无穷大”值。抛出异常实际上会违反该标准。

整数算术(由Java和大多数其他语言和硬件实现为two's complement表示)是不同的,没有特殊的无穷大或NaN值,因此抛出异常是一种有用的行为。

答案 1 :(得分:45)

除以零的结果在数学上是未定义,可以用float / double表示(如NaN - 而不是数字),它不是,但是,在任何基本意义上都是错误的。

由于整数必须包含特定的数值,因此在处理它们时必须将除以零的错误抛出。

答案 2 :(得分:5)

存储double的方式与int完全不同。有关Java如何处理双重计算的更详细说明,请参阅http://firstclassthoughts.co.uk/java/traps/java_double_traps.html。您还应该阅读浮点数,特别是Not a Number (NaN)的概念。

如果您有兴趣了解有关浮点表示的更多信息,我建议您阅读this document(Word格式,抱歉)。它深入研究数字的二进制表示,这可能有助于您理解。

答案 3 :(得分:4)

尽管Java开发人员知道双原语类型和Double类,但在进行浮点运算时,他们对Double.INFINITYNaN-0.0的关注不够。以及管理涉及它们的算术计算的其他规则。

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

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

这对你有帮助。

答案 4 :(得分:4)

除以零(0或0.00)

  1. 如果将double除以0,JVM将显示 Infinity

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

    控制台: Infinity

  2. 如果将int除以0,则JVM将抛出算术异常

    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

  4. 这是因为JVM会自动将cast int类型化为double,因此我们得到无穷大而不是ArithmeticException。