我有代码来计算2号之间的百分比差异- (oldNum - newNum) / oldNum * 100;
-在这两个数字是double
秒。 我预计将有增加某种检查/异常的情况下,oldNum处理的是0。但是,当我做了两个oldNum和newNum 0.0值的试运行,继续执行,就好像什么也没发生,并抛出任何错误。 运行该代码int
小号肯定会导致算术师零例外。 为什么Java的忽略它,当它涉及到double
S'
Answer 1:
除以零的结果是,从数学上讲, 未定义 ,其可与一个浮子来表示/双(如NaN
-非数字),它是没有,但是,在不对任何根本的意义。
作为一个整数必须持有具体的数值,错误必须在被零除与他们打交道时抛出。
Answer 2:
Java的float
和double
类型,如几乎任何其他语言在那里(和几乎任何硬件FP单元),执行IEEE 754标准浮点运算,它由零责成师返回一个特殊的“无限”的值。 抛出异常实际上违反该标准。
整数运算(如实施补的Java表示和大多数其他语言和硬件)是不同的,有没有什么特别的无穷大或NaN值,从而抛出异常是有一个有用的行为。
Answer 3:
双存储方式是一个int很大的不同。 见http://firstclassthoughts.co.uk/java/traps/java_double_traps.html针对Java如何处理双重计算更详细的解释。 你也应该对浮点数读了起来,特别的概念不是数字(NAN) 。
如果您想了解更多关于浮点表示,我建议阅读本文档 (Word格式,抱歉)。 它深入探讨了数字的二进制表示,这可能有助于你的理解。
Answer 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
。
它可能对你有帮助。
Answer 5:
当由零(0或0.00)划分
如果您除以0双,JVM将显示无穷大 。
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
控制台:
Infinity
如果您除以0 INT,那么JVM将抛出算术异常 。
public static void main(String [] args){ int a=10; System.out.println(a/0); }
控制台:
Exception in thread "main" java.lang.ArithmeticException: / by zero
但是,如果我们通过0.0除以INT,那么JVM将呈现无限:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
控制台:
Infinity
这是因为JVM会自动强制类型转换INT翻一番,所以我们得到无限的,而不是ArithmeticException。