Чому така логіка
NaN
засоби Not a Number
. Що не число? Що завгодно. Ви можете мати що завгодно в одній стороні і будь-що в іншій стороні, тому нічого не гарантує, що обидва рівні. NaN
розраховується з Double.longBitsToDouble(0x7ff8000000000000L)
та, як ви бачите в документації longBitsToDouble
:
Якщо аргументом є будь-яке значення в діапазоні 0x7ff0000000000001L
через
0x7fffffffffffffffL
або в діапазоні 0xfff0000000000001L
наскрізь
0xffffffffffffffffL
, то результат a 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);