Почему эта логика
NaNзначит Not a Number. Что не число? Что-нибудь. У вас может быть что угодно с одной стороны и что угодно с другой стороны, поэтому ничто не гарантирует, что оба равны. NaNрассчитывается с Double.longBitsToDouble(0x7ff8000000000000L)и, как вы можете видеть в документации longBitsToDouble:
Если аргумент является любое значение в диапазоне 0x7ff0000000000001Lчерез
0x7fffffffffffffffLили в диапазоне от 0xfff0000000000001Lсквозной
0xffffffffffffffffL, то результат будет 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);