302 votes

Comment tester pour voir si un double est égal à NaN ?

J'ai un double en Java et je veux vérifier s'il est NaN . Quelle est la meilleure façon de procéder ?

503voto

Benoit Points 39210

Utilisez l'option statique Double.isNaN(double) ou votre Double 's .isNaN() méthode.

// 1. static method
if (Double.isNaN(doubleValue)) {
    ...
}
// 2. object's method
if (doubleObject.isNaN()) {
    ...
}

Faire simplement :

if (var == Double.NaN) {
    ...
}

est pas suffisant en raison de la façon dont le Norme IEEE pour les NaN et les nombres à virgule flottante est définie.

51 votes

Une autre façon de le faire serait v != v. Seul NaN compare faux avec lui-même. Ne faites pas cela cependant, isNaN est un million de fois mieux :)

5 votes

@Joren, mieux vaut tard que jamais : "isNaN" est en effet mieux à utiliser que v != v pour la lisibilité. Mais le code source de la méthode isNaN est exactement la même chose que de dire v != v. Source : static public boolean isNaN(double v) { return (v != v) ; }

1 votes

Double.isNaN should be (true) belle réponse

48voto

Andrew Hare Points 159332

Essayez Double.isNaN() :

Renvoie true si cette valeur Double est un Not-a-Number (NaN), false sinon.

Notez que [ double.isNaN() ] ne fonctionnera pas, car les doubles non boxés n'ont pas de méthodes associées.

0 votes

Je croyais qu'on ne pouvait pas appeler des méthodes sur des types primitifs en Java. Il faut vraiment que ce soit Double.isNan() et non double.IsNan() n'est-ce pas ?

0 votes

Joren, il s'appuie sur l'autoboxage (double converti en Double par le compilateur/runtime) ; nouvelle fonctionnalité à partir de la 1.5. Peu de risques dans cette direction ; passer de Double à Double crée un risque de NullPointerExceptions.

0 votes

Je pensais que l'autoboxage ne fonctionnait que pour utiliser le double comme argument, l'ajouter à une collection, etc. Essayez de déclarer le double x puis de demander à x isNaN() - cela me donne une erreur de compilation.

18voto

Grzegorz Gajos Points 443

Vous pourriez envisager de vérifier également si une valeur est finie via Double.isFinite(value) . Depuis Java 8, il existe une nouvelle méthode dans Double classe où vous pouvez vérifier en une fois si une valeur n'est pas NaN et infinie.

/**
 * Returns {@code true} if the argument is a finite floating-point
 * value; returns {@code false} otherwise (for NaN and infinity
 * arguments).
 *
 * @param d the {@code double} value to be tested
 * @return {@code true} if the argument is a finite
 * floating-point value, {@code false} otherwise.
 * @since 1.8
 */
public static boolean isFinite(double d)

10voto

HyperNeutrino Points 3331

Vous pouvez vérifier la présence de NaN en utilisant var != var . NaN n'est pas égal à NaN .

EDIT : C'est probablement de loin la pire méthode. Elle est confuse, peu lisible, et globalement une mauvaise pratique.

1voto

PeterPainter Points 1

Si votre valeur testée est une Double (pas une primitive) et pourrait être null (qui n'est évidemment pas un nombre aussi), alors vous devez utiliser le terme suivant :

(value==null || Double.isNaN(value))

Desde isNaN() veut une primitive (plutôt que de mettre en boîte tout double primitif vers un Double ), en passant un null (qui ne peut pas être décomposée en une valeur de type Double ) entraînera une exception au lieu du résultat attendu. false .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X