69

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

4

5 回答 5

113

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

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

于 2010-03-04T18:16:19.183 回答
47

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

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

于 2010-03-04T17:58:39.990 回答
6

当除以零( 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 将抛出Arithmetic 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 会自动将类型强制转换为 double,所以我们得到的是 infinity 而不是 ArithmeticException。

于 2017-10-01T10:59:59.423 回答
5

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

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

于 2010-03-04T18:05:18.163 回答
4

尽管 Java 开发人员知道双基本类型和Double类,但在进行浮点运算时,他们并没有足够注意Double.INFINITY,NaN-0.0其他管理涉及它们的算术计算的规则。

这个问题的简单答案是它不会 throwArithmeticException和 return Double.INFINITY。另外,请注意,比较x == Double.NaN总是评估为false,即使它x本身是 a NaN

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

它可能对你有帮助。

于 2016-02-02T10:18:36.490 回答