なぜそのロジック
NaN
を意味しNot a Number
ます。数字とは何ですか?なんでも。あなたは片側に何でも持つことができ、反対側に何でも持つことができるので、両方が等しいことを保証するものは何もありません。NaN
で計算さDouble.longBitsToDouble(0x7ff8000000000000L)
れ、のドキュメントで確認できるようにlongBitsToDouble
:
引数が範囲内の任意の値である場合0x7ff0000000000001L
を介して
0x7fffffffffffffffL
又は範囲0xfff0000000000001L
を介して
0xffffffffffffffffL
、結果はNaN
。
また、NaN
API内で論理的に処理されます。
ドキュメンテーション
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code double}. It is equivalent to the value returned by
* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
*/
public static final double NaN = 0.0d / 0.0;
ところで、NaN
され、あなたのコードサンプルとして試験:
/**
* Returns {@code true} if the specified number is a
* Not-a-Number (NaN) value, {@code false} otherwise.
*
* @param v the value to be tested.
* @return {@code true} if the value of the argument is NaN;
* {@code false} otherwise.
*/
static public boolean isNaN(double v) {
return (v != v);
}
解決
あなたができることはcompare
/を使うことですcompareTo
:
Double.NaN
このメソッドでは、それ自体と等しく、他のすべてのdouble
値(を含むDouble.POSITIVE_INFINITY
)よりも大きいと見なされます
。
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
またはequals
:
this
とのargument
両方が表す場合Double.NaN
、equals
メソッドは値を持っtrue
ていますが、
戻りDouble.NaN==Double.NaN
ますfalse
。
Double.NaN.equals(Double.NaN);