2011-03-13 79 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

的原因爲這些特殊的情況下,在基本舍入誤差。浮點數通常會被截斷,因爲它們從來都不是精確的。另一方面,整數總是精確的。