Wie testest du, ob ein Double gleich NaN ist?

283

Ich habe ein Double in Java und möchte überprüfen, ob es ist NaN. Was ist der beste Weg, dies zu tun?

Eric Wilson
quelle

Antworten:

475

Verwenden Sie die statische Double.isNaN(double)Methode oder Ihre Double‚s - .isNaN()Methode.

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

Einfach machen:

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

ist nicht ausreichend, da der IEEE-Standard für NaN- und Gleitkommazahlen definiert ist.

Ben S.
quelle
51
Ein anderer Weg, dies zu tun, wäre v! = V. Nur NaN vergleicht false mit sich selbst. Tun Sie das aber nicht, isNaN ist millionenfach besser. :)
Joren
5
@Joren, besser spät als nie: 'isNaN' ist in der Tat besser zu verwenden als v! = V für die Lesbarkeit. Der Quellcode der isNaN-Methode entspricht jedoch genau der Aussage v! = V. Quelle: static public boolean isNaN (double v) {return (v! = V); }
Rolf ツ
1
Double.isNaN should be (true) nette Antwort
Oliver Shaw
@ Joren isNaN überprüfen Sie nur v! = V;), aber es sieht besser aus
Herr Jedi
Verwenden von Java 5: value == Double.NaNfunktioniert nicht, funktioniert aber Double.isNaN(value)einwandfrei.
zero01alpha
45

Versuchen Sie Double.isNaN():

Gibt true zurück, wenn dieser Double-Wert eine Not-a-Number (NaN) ist, andernfalls false.

Beachten Sie, dass [ double.isNaN()] nicht funktioniert, da Doppelpacks ohne Box keine Methoden zugeordnet sind.

Andrew Hare
quelle
Ich dachte, Sie könnten in Java keine Methoden für primitive Typen aufrufen. Es muss wirklich sein Double.isNan()und nicht double.IsNan(), oder?
Joren
Joren, er verlässt sich auf Autoboxing (Double wird vom Compiler / zur Laufzeit in Double konvertiert); neue Funktion ab 1.5. Geringes Risiko in diese Richtung; Wenn Sie von Double zu Double wechseln, besteht das Risiko von NullPointerExceptions.
M1EK
Ich dachte, Autoboxing funktioniert nur, wenn man das Double als Argument verwendet, es einer Sammlung hinzufügt und dergleichen. Versuchen Sie, double x zu deklarieren und dann x zu isNaN () zu fragen - dies gibt mir einen Compilerfehler.
Carl
Wirklich, ich vermute, Andrew hat gerade die Umschalttaste verpasst, mit der er das erste "Doppel" eingegeben hat.
Carl
14

Möglicherweise möchten Sie auch prüfen, ob ein Wert über endlich ist Double.isFinite(value). Seit Java 8 gibt es eine neue Methode in der DoubleKlasse, mit der Sie sofort überprüfen können, ob ein Wert nicht NaN und unendlich ist.

/**
 * 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)
Grzegorz Gajos
quelle
10

Sie können mit NaN nach NaN suchen var != var. NaNist nicht gleich NaN.

EDIT : Dies ist wahrscheinlich die mit Abstand schlechteste Methode. Es ist verwirrend, schrecklich für die Lesbarkeit und insgesamt schlechte Praxis.

HyperNeutrino
quelle
3
Kann jemand die Ablehnung erklären? Ich weiß, dieser Weg ist sehr schlecht und isNanbesser für die Lesbarkeit, aber er funktioniert, oder? Und die isNanMethode verwendet dies, um zu überprüfen NaN.
HyperNeutrino
1
Ich vermute, die Ablehnung war, weil dieser Weg sehr schlecht ist und isNaN besser für die Lesbarkeit ist.
Edward Falk
1
Ich habe Sie nicht abgelehnt, aber ich denke, ein zusätzlicher Kommentar wäre hier nützlich: Wenn Sie Wrapper wie Float oder Double vergleichen, vergleichen Sie Referenzen auf diese Weise, nicht deren Werte, was definitiv nicht das ist, was Sie wollen.
Battle_Slug
3
@Battle_Slug Danke für den Kommentar. Ich weiß, dass dies eine sehr schlechte Idee ist, aber ich habe sie der Vollständigkeit halber hier angegeben.
HyperNeutrino
isNaNtut dies unter der Haube, aber wie funktioniert es? Wie gleicht sich etwas nicht?
Wilmol
0

Anfänger brauchen praktische Beispiele. Versuchen Sie also den folgenden Code.

public class Not_a_Number {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String message = "0.0/0.0 is NaN.\nsimilarly Math.sqrt(-1) is NaN.";        
    String dottedLine = "------------------------------------------------";     

    Double numerator = -2.0;
    Double denominator = -2.0;      
    while (denominator <= 1) {
        Double x = numerator/denominator;           
        Double y = new Double (x);
        boolean z = y.isNaN();
        System.out.println("y =  " + y);
        System.out.println("z =  " + z);
        if (z == true){
            System.out.println(message);                
        }
        else {
            System.out.println("Hi, everyone"); 
        }
        numerator = numerator + 1;
        denominator = denominator +1;
        System.out.println(dottedLine);         
    } // end of while

} // end of main

} // end of class
pggajendra babu
quelle
2
Dieses Beispiel macht zu viel und es ist nicht klar, was Sie zeigen wollten. Dies ist nur ein Haufen fragmentierten Codes.
Jared Hooper
3
Als OP, der ein Anfänger war, als diese Frage im Jahr 2009 gestellt wurde, kann ich Ihnen versichern, dass die akzeptierte Antwort weitaus hilfreicher war als dieses "praktische" Beispiel.
Eric Wilson
Vielen Dank an @pggajendra babu für die Veröffentlichung dieses Beispielcodes.
Datum
0

Das folgende Code-Snippet hilft bei der Bewertung des NaN mit primitivem Typ.

double dbl = Double.NaN; Double.valueOf(dbl).isNaN() ? true : false;

Teela
quelle