Tại sao logic đó
NaNcó 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 0x7ff0000000000001Lthông qua
0x7fffffffffffffffLhoặ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 doublegiá 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 thisvà argumentcả hai đại diện Double.NaN, thì equalsphương thức trả về true, mặc dù
Double.NaN==Double.NaNcó giá trị false.
Double.NaN.equals(Double.NaN);