11

効果的なJavaからの引用-JoshuaBlochによる第2版

浮動小数点フィールドの場合、関係演算子の代わりにDouble.compareまたはFloat.compareを使用します。これらは、浮動小数点値に適用された場合、 compareToの一般的なコントラクトに従いません。

なぜそうなるのかについては詳しく説明していません。

だから、私の質問は:

関係演算子は、浮動小数点値とともに使用された場合、compareToの一般的なコントラクトにどのように従わないのでしょうか。

4

3 に答える 3

6

javadocから:

 public int compareTo(Double anotherDouble)

2 つの Double オブジェクトを数値的に比較します。このメソッドによって実行される比較が、Java 言語の数値比較演算子 (<、<=、==、>=、>) によって実行される比較と異なる点が 2 つあります (プリミティブ double 値に適用される場合)。メソッドはそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きい必要があります。このメソッドでは、0.0d は -0.0d より大きいと見なされます。これにより、このメソッドによって適用される Double オブジェクトの自然順序付けが equals と一致することが保証されます。

于 2012-10-12T20:54:52.887 に答える
4

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
于 2012-10-12T20:54:39.910 に答える