为什么1/0给出错误但1 / 0.0返回“Inf”?

我只是好奇这个:

在Java中评估1/0时,会发生以下exception:

线程“main”中的exceptionjava.lang.ArithmeticException:/在Foo.main中为零(Foo.java:3)

但是1/0.0被评估为Infinity

 public class Foo { public static void main (String[] args) { System.out.println(1/0.0); } } 

为什么会这样?

那是因为整数没有+/- Inf,NaN的值,并且不允许除以0,而浮点数确实具有这些特殊值。

1/0是两个int的除法,并抛出一个exception,因为你不能除以整数零。 但是,0.0是double类型的文字,Java将使用浮点除法。 IEEE浮点规范具有除以零的特殊值(除其他外),其中一个是double .Infinity。

如果您对细节感兴趣,浮点规范(通常是含糊不清的)在维基百科上有一个页面: http : //en.wikipedia.org/wiki/IEEE_754-2008 ,其全文也可以在线阅读: http : //ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber = 4610933 。

1/0是整数除法,1 / 0.0是浮点除法 – 浮点数可以表示无效值,整数不能。

IEEE已经定义了浮点数的某些标准,其中包括“非数字”和正负无穷大的定义。 这些不适用于整数。

请参见http://steve.hollasch.net/cgindex/coding/ieeefloat.html

这些特殊情况的原因基本上是舍入错误。 浮点数通常总是被截断,因为它们永远不会精确。 另一方面,整数总是精确的。