Perché quella logica
NaN
significa Not a Number
. Cosa non è un numero? Nulla. Puoi avere qualsiasi cosa da una parte e qualsiasi cosa dall'altra parte, quindi nulla garantisce che entrambi siano uguali. NaN
viene calcolato con Double.longBitsToDouble(0x7ff8000000000000L)
e come puoi vedere nella documentazione di longBitsToDouble
:
Se l'argomento è un valore nell'intervallo 0x7ff0000000000001L
attraverso
0x7fffffffffffffffL
o nell'intervallo 0xfff0000000000001L
attraverso
0xffffffffffffffffL
, il risultato è a NaN
.
Inoltre, NaN
viene logicamente trattato all'interno dell'API.
Documentazione
/**
* 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;
A proposito, NaN
viene testato come esempio di codice:
/**
* 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);
}
Soluzione
Quello che puoi fare è usare compare
/ compareTo
:
Double.NaN
è considerato da questo metodo uguale a se stesso e maggiore di tutti gli altri double
valori (incluso
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Oppure equals
:
Se this
ed argument
entrambi rappresentano Double.NaN
, quindi il equals
metodo ritorna true
, anche se
Double.NaN==Double.NaN
ha il valore false
.
Double.NaN.equals(Double.NaN);