Pourquoi cette logique
NaNsignifie 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. NaNest 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 0x7ff0000000000001Ljusqu'à
0x7fffffffffffffffLou dans la plage 0xfff0000000000001Ljusqu'à
0xffffffffffffffffL, le résultat est a NaN.
En outre, NaNest 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.NaNest considérée par cette méthode comme égale à elle-même et supérieure à toutes les autres doublevaleurs (y compris
Double.POSITIVE_INFINITY).
Double.compare(Double.NaN, Double.NaN);
Double.NaN.compareTo(Double.NaN);
Ou, equals:
Si thiset les argumentdeux représentent Double.NaN, alors la equalsméthode retourne true, même si elle
Double.NaN==Double.NaNa la valeur false.
Double.NaN.equals(Double.NaN);