効果的なJavaからの引用-JoshuaBlochによる第2版
浮動小数点フィールドの場合、関係演算子の代わりにDouble.compareまたはFloat.compareを使用します。これらは、浮動小数点値に適用された場合、 compareToの一般的なコントラクトに従いません。
なぜそうなるのかについては詳しく説明していません。
だから、私の質問は:
関係演算子は、浮動小数点値とともに使用された場合、compareToの一般的なコントラクトにどのように従わないのでしょうか。
効果的なJavaからの引用-JoshuaBlochによる第2版
浮動小数点フィールドの場合、関係演算子の代わりにDouble.compareまたはFloat.compareを使用します。これらは、浮動小数点値に適用された場合、 compareToの一般的なコントラクトに従いません。
なぜそうなるのかについては詳しく説明していません。
だから、私の質問は:
関係演算子は、浮動小数点値とともに使用された場合、compareToの一般的なコントラクトにどのように従わないのでしょうか。
javadocから:
public int compareTo(Double anotherDouble)
2 つの Double オブジェクトを数値的に比較します。このメソッドによって実行される比較が、Java 言語の数値比較演算子 (<、<=、==、>=、>) によって実行される比較と異なる点が 2 つあります (プリミティブ double 値に適用される場合)。メソッドはそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きい必要があります。このメソッドでは、0.0d は -0.0d より大きいと見なされます。これにより、このメソッドによって適用される Double オブジェクトの自然順序付けが equals と一致することが保証されます。
JavaDoc からDouble::compareTo
2 つの Double オブジェクトを数値的に比較します。このメソッドによって実行される比較が、Java 言語の数値比較演算子 (<、<=、==、>= >) によって実行される比較と異なる点が 2 つあります (プリミティブ double 値に適用される場合)。
このメソッドでは、Double.NaN はそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きいと見なされます。
このメソッドでは、0.0d は -0.0d より大きいと見なされます。
これにより、Double.compareTo(Object) (その動作をこのメソッドに転送する) が Comparable.compareTo の一般規約に従い、Double の自然順序が 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