我有代码来计算两个数字之间的百分比差异 - (oldNum - newNum) / oldNum * 100;
- 其中两个数字都是double
s。我希望在oldNum为0的情况下添加某种检查/异常处理。但是,当我为oldNum和newNum进行了值为0.0的测试运行时,执行继续,好像什么都没发生并且没有抛出错误。使用int
运行此代码肯定会导致算术除零异常。为什么Java在double
s?
答案 0 :(得分:110)
Java的float
和double
类型,就像其他任何语言(以及几乎任何硬件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.INFINITY
,NaN
,-0.0
的关注不够。以及管理涉及它们的算术计算的其他规则。
这个问题的简单答案是它不会抛出ArithmeticException
并返回Double.INFINITY
。另请注意,即使x == Double.NaN
本身为false
,比较x
也始终评估为NaN
。
要测试x
是否为NaN
,应使用方法调用Double.isNaN(x)
来检查给定的数字是否为NaN。这与NULL
中的SQL
非常接近。
这对你有帮助。
答案 4 :(得分:4)
除以零(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将抛出算术异常。
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类型化为double,因此我们得到无穷大而不是ArithmeticException。