我有代码来计算 2 个数字之间的百分比差异(oldNum - newNum) / oldNum * 100;
- 其中两个数字都是double
s。我希望在 oldNum 为 0 的情况下必须添加某种检查/异常处理。但是,当我对 oldNum 和 newNum 的值都为 0.0 进行测试运行时,执行继续进行,就好像什么都没发生并且没有引发错误一样。使用 s 运行此代码int
肯定会导致算术除零异常。为什么Java在涉及到double
s时会忽略它?
5 回答
Javafloat
和double
类型,与几乎所有其他语言(以及几乎所有硬件 FP 单元)一样,实现了浮点数学的IEEE 754标准,该标准要求除以零以返回特殊的“无穷大”值。抛出异常实际上会违反该标准。
整数算术(由 Java 和大多数其他语言和硬件实现为二进制补码表示)是不同的,没有特殊的无穷大或 NaN 值,因此抛出异常是一种有用的行为。
从数学上讲,除以零的结果是undefined,可以用 float/double 表示(作为NaN
- 不是数字),但是在任何基本意义上它都不是错误的。
由于整数必须包含特定的数值,因此在处理它们时必须在除以零时引发错误。
当除以零( 0 或 0.00 )
如果将 double 除以 0,JVM 将显示Infinity。
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
安慰:
Infinity
如果将 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
但是如果我们将 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。
double 的存储方式与 int 完全不同。有关Java 如何处理双重计算的更详细说明,请参见http://firstclassthoughts.co.uk/java/traps/java_double_traps.html 。您还应该阅读浮点数,特别是Not a Number (NaN)的概念。
如果您有兴趣了解有关浮点表示的更多信息,我建议您阅读此文档(Word 格式,抱歉)。它深入研究了数字的二进制表示,这可能有助于您的理解。
尽管 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
。
它可能对你有帮助。