Kenapa logika itu
NaNberarti Not a Number. Apa yang bukan angka? Apa pun. Anda dapat memiliki apa pun di satu sisi dan apa pun di sisi lain, jadi tidak ada yang menjamin keduanya sama. NaNdihitung dengan Double.longBitsToDouble(0x7ff8000000000000L)dan seperti yang Anda lihat dalam dokumentasi longBitsToDouble:
Jika argumennya adalah nilai apa pun dalam rentang 0x7ff0000000000001Lmelalui
0x7fffffffffffffffLatau dalam rentang 0xfff0000000000001Lmelalui
0xffffffffffffffffL, hasilnya adalah a NaN.
Juga, NaNdiperlakukan secara logis di dalam API.
Dokumentasi
/**
* 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;
By the way, NaN yang diuji sebagai sampel kode Anda:
/**
* 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);
}
Larutan
Yang bisa Anda lakukan adalah menggunakan compare/ compareTo:
Double.NaNdianggap oleh metode ini sama dengan dirinya sendiri dan lebih besar dari semua doublenilai lainnya (termasuk
Double.POSITIVE_INFINITY).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Atau, equals:
Jika thisdan argumentkeduanya mewakili Double.NaN, maka equalsmetode kembali true, meskipun
Double.NaN==Double.NaNmemiliki nilai false.
Double.NaN.equals(Double.NaN);