2009-09-21 16 views

Odpowiedz

386

Użyj metody statycznej: Double.isNaN(double) lub metody Double '.isNaN().

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

prostu robi:

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

jest nie wystarcza powodu jak IEEE standard for NaN and floating point numbers jest zdefiniowana.

+44

Innym sposobem na to byłoby v! = V. Tylko NaN porównuje wartość false z samym sobą. Nie rób tego jednak, isNaN jest milion razy lepszy. :) – Joren

+8

To nie działa dla mnie. Double.isNaN (var) działał jednak – fiacobelli

+3

@Joren, lepiej późno niż wcale: 'isNaN' jest rzeczywiście lepszy w użyciu niż v! = V dla czytelności. Ale kod źródłowy metody isNaN jest dokładnie taki sam, jak w przypadku v. = V. Źródło: static public boolean isNaN (double v) { return (v! = V); } –

42

Spróbuj Double.isNaN():

Zwraca prawdę, jeśli wartość jest dwukrotnie Not-a-Number (NaN), w przeciwnym wypadku false.

Pamiętaj, że [double.isNaN()] nie będzie działać, ponieważ niepobrane duble nie mają powiązanych z nimi metod.

+0

Myślałem, że nie można wywoływać metod na typach pierwotnych w Javie. To naprawdę musi być 'Double.isNan()', a nie 'double.IsNan()', prawda? – Joren

+0

Joren, on polega na autoboxing (podwójne przekształcanie się w Double przez kompilator/środowisko wykonawcze); nowa funkcja od 1.5. Małe ryzyko pójścia w tym kierunku; przejście z Double do Double stwarza ryzyko NullPointerExceptions. – M1EK

+0

Myślałem, że autoboxing działa tylko przy użyciu podwójnego jako argumentu, dodając go do kolekcji i tym podobne. Spróbuj zadeklarować podwójne x, a następnie pytanie x do isNaN() - daje mi błąd kompilatora. – Carl

-2

Początkujący potrzebują praktycznych przykładów. więc wypróbuj poniższy kod.

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 
+2

Ten przykład robi za dużo i nie jest jasne, co próbujesz pokazać. To tylko kilka fragmentów kodu. –

+2

Jako OP, który był początkującym, gdy pytanie to zadano w roku 2009, mogę zapewnić, że zaakceptowana odpowiedź była znacznie bardziej pomocna niż ten "praktyczny" przykład. –

+0

Dziękuję @ p.g.gajendra babu za opublikowanie tego przykładowego kodu. – datnt

10

Możesz sprawdzić NaN za pomocą var != var. NaN nie jest równy NaN.

EDIT: To chyba zdecydowanie najgorsza metoda. To jest mylące, okropne dla czytelności i ogólnie złej praktyki.

+2

Czy ktoś może wyjaśnić sprawę? Wiem, że sposób jest bardzo zły, a 'isNan' jest lepszy dla czytelności, ale działa, prawda? A metoda 'isNan' używa tego do sprawdzenia' NaN'. – HyperNeutrino

+1

Zgaduję, że spadł, ponieważ ta droga jest bardzo zła, a isNaN jest lepsza dla czytelności. –

+0

Nie doceniłem cię, ale myślę, że przydatny byłby dodatkowy komentarz: jeśli porównasz opakowania takie jak Float lub Double, porównujesz odniesienia w ten sposób, a nie ich wartości, co zdecydowanie nie jest tym, czego potrzebujesz. –

7

Warto rozważyć także sprawdzenie, czy wartość jest skończona przez Double.isFinite(value). Od wersji Java 8 jest nowa metoda klasy Double, w której można sprawdzić od razu, czy wartość nie ma wartości NaN i nieskończoności.

/** 
* 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) 
Powiązane problemy