2011-03-13 124 views
21

我只是好奇这个:为什么1/0给出错误,但1/0.0返回“Inf”?

在评估中的Java 1/0,会出现以下异常:

异常线程 “main” java.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); 
    } 
} 

这是为什么发生?

回答

27

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

+0

对于NaN,并没有真正的+和 - 值。 – 2011-03-13 19:13:22

+0

@PaŭloEbermann:谢谢,修正。 – ninjalj 2011-03-13 19:38:55

1

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

11

1/0是两个除法int s,并且抛出一个异常,因为您不能用整数零进行除法。但是,0.0是类型的文字,Java将使用浮点除法。 IEEE浮点规范具有用于除以零的特殊值(其中之一),其中之一是double.Infinity。

如果你感兴趣的细节,浮点规范(通常是隐蔽)在维基百科的页面:http://en.wikipedia.org/wiki/IEEE_754-2008,其全文也可以在线阅读:http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933

+3

不幸的是,Java不允许设置IEEE 754-2008陷阱。如果你在你的代码中写入1/0.0,那很明显Infinity来自哪里,但是如果你从一个有很多数字的函数中得到NaN,[找出究竟出了什么问题并不简单](http:// stackoverflow.com/questions/2140501/java-maths-testing-for-nan)。 – 2011-03-13 19:14:50

1

IEEE已经为浮点数定义了一些标准,包括“非数字”和正负无限的定义。这些不适用于整数。

http://steve.hollasch.net/cgindex/coding/ieeefloat.html

的原因为这些特殊的情况下,在基本舍入误差。浮点数通常会被截断,因为它们从来都不是精确的。另一方面,整数总是精确的。