2012-10-12 10 views
10

從有效的Java引用 - 由Joshua布洛赫關係運算符以何種方式不服從compareTo與浮點值約定?

第二版對於浮點字段,使用Double.compare或Float.compare替代關係運算符,它不服從總承包爲的compareTo應用於浮點值時。

它沒有詳細說明爲什麼會出現這種情況。

所以,我的問題是:

以何種方式關係運算符失敗,浮點值時服從的compareTo爲一般合同?

+2

相關:http://stackoverflow.com/a/3668105/396458 – NullUserException

+0

這些類允許NaN(非數字)值。 –

回答

6

javadoc

public int compareTo(Double anotherDouble) 

數字上比較兩個雙對象。使用此方法進行比較時,有兩種方法與Java語言數值比較運算符(<,< =,==,> =,>)應用於原始雙精度值時執行的比較有所不同: Double.NaN被認爲是此方法與自身相等並且大於其他所有double值(包括Double.POSITIVE_INFINITY)。 該方法認爲0.0d大於-0.0d。 這確保了由此方法施加的Double對象的自然順序與equals相一致。

+0

感謝您的參考:) –

3

從Java文檔Double#compareTo

數字上比較兩個雙對象。存在其中通過該方法執行的比較兩種方式從那些由Java語言數值比較運算符執行不同(<,< =,==,> =>)當施加到基本的double值:

  • 該方法認爲Double.NaN等於自身,並且大於所有其他double值(包括Double.POSITIVE_INFINITY)。

  • 該方法認爲0.0d大於-0.0d。

這確保了Double.compareTo(對象)(其中其行爲轉發給此方法)服從於Comparable.compareTo一般的合同,並且在雙打的自然順序與equals一致。

double d1 =Double.NaN; 
    double d2 = Double.NaN; 

    System.out.println(Double.valueOf(d1).equals(d2)); ---> true 
    System.out.println(Double.valueOf(d1).compareTo(d2)); ---> 0 
    System.out.println(d1 == d2);       --->false 
+0

但是,值得注意的是,它與關係運算符是不一致的。 –

+0

@LouisWasserman是的。還補充說。 –