¿Por qué esa lógica?
NaN
significa Not a Number
. ¿Qué no es un número? Cualquier cosa. Puede tener cualquier cosa en un lado y cualquier cosa en el otro lado, por lo que nada garantiza que ambos sean iguales. NaN
se calcula con Double.longBitsToDouble(0x7ff8000000000000L)
y como puede ver en la documentación de longBitsToDouble
:
Si el argumento es cualquier valor en el rango 0x7ff0000000000001L
medio
0x7fffffffffffffffL
o en el rango 0xfff0000000000001L
medio
0xffffffffffffffffL
, el resultado es una NaN
.
Además, NaN
se trata lógicamente dentro de la API.
Documentación
/**
* 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;
Por cierto, NaN
se prueba como muestra de código:
/**
* 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);
}
Solución
Lo que puedes hacer es usar compare
/ compareTo
:
Double.NaN
Este método considera que es igual a sí mismo y mayor que todos los demás double
valores (incluidos
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
O equals
:
Si this
y argument
ambos representan Double.NaN
, entonces el equals
método regresa true
, aunque
Double.NaN==Double.NaN
tenga el valor false
.
Double.NaN.equals(Double.NaN);