從有效的Java引用 - 由Joshua布洛赫關係運算符以何種方式不服從compareTo與浮點值約定?
第二版對於浮點字段,使用Double.compare或Float.compare替代關係運算符,它不服從總承包爲的compareTo應用於浮點值時。
它沒有詳細說明爲什麼會出現這種情況。
所以,我的問題是:
以何種方式關係運算符失敗,浮點值時服從的compareTo爲一般合同?
從有效的Java引用 - 由Joshua布洛赫關係運算符以何種方式不服從compareTo與浮點值約定?
第二版對於浮點字段,使用Double.compare或Float.compare替代關係運算符,它不服從總承包爲的compareTo應用於浮點值時。
它沒有詳細說明爲什麼會出現這種情況。
所以,我的問題是:
以何種方式關係運算符失敗,浮點值時服從的compareTo爲一般合同?
從javadoc:
public int compareTo(Double anotherDouble)
數字上比較兩個雙對象。使用此方法進行比較時,有兩種方法與Java語言數值比較運算符(<,< =,==,> =,>)應用於原始雙精度值時執行的比較有所不同: Double.NaN被認爲是此方法與自身相等並且大於其他所有double值(包括Double.POSITIVE_INFINITY)。 該方法認爲0.0d大於-0.0d。 這確保了由此方法施加的Double對象的自然順序與equals相一致。
感謝您的參考:) –
從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
但是,值得注意的是,它與關係運算符是不一致的。 –
@LouisWasserman是的。還補充說。 –
相關:http://stackoverflow.com/a/3668105/396458 – NullUserException
這些類允許NaN(非數字)值。 –