Kenapa logika itu
NaN
berarti 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. NaN
dihitung dengan Double.longBitsToDouble(0x7ff8000000000000L)
dan seperti yang Anda lihat dalam dokumentasi longBitsToDouble
:
Jika argumennya adalah nilai apa pun dalam rentang 0x7ff0000000000001L
melalui
0x7fffffffffffffffL
atau dalam rentang 0xfff0000000000001L
melalui
0xffffffffffffffffL
, hasilnya adalah a NaN
.
Juga, NaN
diperlakukan 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.NaN
dianggap oleh metode ini sama dengan dirinya sendiri dan lebih besar dari semua double
nilai lainnya (termasuk
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Atau, equals
:
Jika this
dan argument
keduanya mewakili Double.NaN
, maka equals
metode kembali true
, meskipun
Double.NaN==Double.NaN
memiliki nilai false
.
Double.NaN.equals(Double.NaN);