Pourquoi cette logique
NaN
signifie Not a Number
. Qu'est-ce qui n'est pas un nombre? N'importe quoi. Vous pouvez avoir n'importe quoi d'un côté et n'importe quoi de l'autre côté, donc rien ne garantit que les deux sont égaux. NaN
est calculé avec Double.longBitsToDouble(0x7ff8000000000000L)
et comme vous pouvez le voir dans la documentation de longBitsToDouble
:
Si l'argument est une valeur dans la plage 0x7ff0000000000001L
jusqu'à
0x7fffffffffffffffL
ou dans la plage 0xfff0000000000001L
jusqu'à
0xffffffffffffffffL
, le résultat est a NaN
.
En outre, NaN
est traité logiquement à l'intérieur de l'API.
Documentation
/**
* 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;
En passant, NaN
est testé comme exemple de code:
/**
* 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);
}
Solution
Ce que vous pouvez faire, c'est utiliser compare
/ compareTo
:
Double.NaN
est considérée par cette méthode comme égale à elle-même et supérieure à toutes les autres double
valeurs (y compris
Double.POSITIVE_INFINITY
).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Ou, equals
:
Si this
et les argument
deux représentent Double.NaN
, alors la equals
méthode retourne true
, même si elle
Double.NaN==Double.NaN
a la valeur false
.
Double.NaN.equals(Double.NaN);