Tại sao logic đó
NaN
có nghĩa là Not a Number
. Những gì không phải là một số? Bất cứ điều gì. Bạn có thể có bất cứ thứ gì ở một bên và bất cứ thứ gì ở phía bên kia, vì vậy không có gì đảm bảo rằng cả hai đều bằng nhau. NaN
được tính toán với Double.longBitsToDouble(0x7ff8000000000000L)
và như bạn có thể thấy trong tài liệu về longBitsToDouble
:
Nếu đối số là bất kỳ giá trị nào trong phạm vi 0x7ff0000000000001L
thông qua
0x7fffffffffffffffL
hoặc trong phạm vi0xfff0000000000001L
thông qua
0xffffffffffffffffL
, kết quả là a NaN
.
Ngoài ra, NaN
được xử lý logic bên trong API.
Tài liệu
/**
* 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;
Nhân tiện, NaN
được kiểm tra như mẫu mã của bạn:
/**
* 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);
}
Giải pháp
Những gì bạn có thể làm là sử dụng compare
/compareTo
:
Double.NaN
được phương pháp này coi là bằng chính nó và lớn hơn tất cả các double
giá trị khác (bao gồm
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Hoặc là, equals
:
Nếu this
và argument
cả hai đại diện Double.NaN
, thì equals
phương thức trả về true
, mặc dù
Double.NaN==Double.NaN
có giá trị false
.
Double.NaN.equals(Double.NaN);