我有代码来计算两个数字之间的百分比差(oldNum - newNum) / oldNum * 100;
--两个数字均为double
s。我希望在oldNum为0的情况下必须添加某种检查/异常处理。但是,当我对oldNum和newNum的值均为0.0进行测试运行时,执行继续,就好像什么都没有发生并且没有引发任何错误。使用int
s来运行此代码肯定会导致算术除零异常。为什么Java在涉及double
s时会忽略它?
我有代码来计算两个数字之间的百分比差(oldNum - newNum) / oldNum * 100;
--两个数字均为double
s。我希望在oldNum为0的情况下必须添加某种检查/异常处理。但是,当我对oldNum和newNum的值均为0.0进行测试运行时,执行继续,就好像什么都没有发生并且没有引发任何错误。使用int
s来运行此代码肯定会导致算术除零异常。为什么Java在涉及double
s时会忽略它?
Answers:
从数学上讲,被零除的结果是undefined,可以用浮点数/双精度数表示(因为NaN
-不是数字),但是从根本上讲这不是错误的。
由于整数必须具有特定的数值,因此在处理它们时必须除以零而引发错误。
float
并且double
不会导致异常。谢谢。
双精度数的存储方式与int完全不同。有关Java如何处理双重计算的更详细说明,请参见http://firstclassthoughts.co.uk/java/traps/java_double_traps.html。您还应该阅读浮点数,尤其是非数字(NaN)的概念。
如果您有兴趣了解有关浮点表示的更多信息,建议您阅读此文档(Word格式,抱歉)。它深入研究数字的二进制表示形式,这可能对您的理解有所帮助。
除以零(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会自动将cast int类型键入为double,因此我们获得了无限而不是ArithmeticException。