我对此很好奇:
在Java中评估1/0
时,会发生以下异常:
线程“main”中的异常 java.lang.ArithmeticException:/ by 零 在Foo.main(Foo.java:3)
但1/0.0
评估为Infinity
。
public class Foo {
public static void main (String[] args) {
System.out.println(1/0.0);
}
}
为什么会这样?
答案 0 :(得分:30)
这是因为整数没有+/- Inf,NaN的值,并且不允许除以0,而浮点数确实具有这些特殊值。
答案 1 :(得分:11)
1/0是两个 int 的除法,并抛出一个异常,因为你不能除以整数零。但是,0.0是 double 类型的文字,Java将使用浮点除法。 IEEE浮点规范具有除以零的特殊值(除其他外),其中一个是double.Infinity。
如果您对细节感兴趣,浮点规范(通常含糊不清)在维基百科上有一个页面:http://en.wikipedia.org/wiki/IEEE_754-2008,其全文也可以在线阅读:http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933。
答案 2 :(得分:2)
1/0是整数除法,1 / 0.0是浮点除法 - 浮点数可以表示无效值,整数不能。
答案 3 :(得分:1)
IEEE已经定义了浮点数的某些标准,其中包括“非数字”和正负无穷大的定义。这些不适用于整数。
请参阅http://steve.hollasch.net/cgindex/coding/ieeefloat.html
这些特殊情况的原因基本上是舍入错误。浮点数通常总是被截断,因为它们永远不会精确。另一方面,整数总是精确的。
答案 4 :(得分:0)
fetestexcept
和feenableexcept
值得注意的是,底层CPU硬件可以检测到0.0 / 0.0
的特定情况,并且:
fetestexcept(FE_ALL_EXCEPT) == FE_INVALID
feenableexcept(FE_INVALID)
glibc扩展名启用了该异常但是我找不到Java是否公开了该功能。
这是一个最小的可运行C示例:What is difference between quiet NaN and signaling NaN?