0

重複の可能性:
Double.NaN==Double.NaN が false を返すのはなぜですか?

これは純粋に好奇心からです。

私はこのようなことをしました:

public static void main(String args[]) throws Exception {
        System.out.println(Double.NaN==Double.NaN);
    }

出力はfalseです。これは返すべきではありませんtrueか?

なぜそうなのですか?

4

2 に答える 2

5

Java言語仕様から:

浮動小数点演算子は例外を生成しません (§11)。オーバーフローする演算は符号付き無限大を生成し、アンダーフローする演算は非正規化値または符号付きゼロを生成し、数学的に明確な結果を持たない演算は NaN を生成します。オペランドとして NaN を使用するすべての数値演算は、結果として NaN を生成します。すでに説明したように、NaN は順序付けされていないため、1 つまたは 2 つの NaN を含む数値比較演算は false を返し、NaN を含む != 比較は true を返します (x が NaN の場合の x!=x を含む)。

ここで重要な文は次のとおりです。

そのため、1 つまたは 2 つの NaN を含む数値比較演算は false を返します

于 2013-01-30T12:52:02.150 に答える
0

2 つの Double を比較する#compareTo(Double)には、このメソッドを使用することをお勧めNaNXXX_INFINITYます。

2 つの Double オブジェクトを数値的に比較します。このメソッドによって実行される比較が、Java 言語の数値比較演算子 (<、<=、==、>=、>) によって実行される比較と異なる点が 2 つあります (プリミティブ double 値に適用される場合)。

このメソッドでは、Double.NaN はそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きいと見なされます。このメソッドでは、0.0d は -0.0d より大きいと見なされます。これにより、このメソッドによって適用される Double オブジェクトの自然順序付けが equals と一致することが保証されます。

public static void main(String[] args) {
  Double d = new Double(Double.NaN);
  System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}
于 2013-01-30T12:58:11.690 に答える