¿Cómo se prueba para ver si un doble es igual a NaN?

283

Tengo un doble en Java y quiero verificar si es así NaN. ¿Cuál es la mejor manera de hacer esto?

Eric Wilson
fuente

Respuestas:

475

Usar la estática Double.isNaN(double)método o su Double's .isNaN()método.

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

Simplemente haciendo:

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

no es suficiente debido a cómo se define el estándar IEEE para NaN y números de coma flotante .

Ben S
fuente
51
Otra forma de hacerlo sería v! = V. Solo NaN compara falso consigo mismo. Sin embargo, no hagas eso, isNaN es un millón de veces mejor. :)
Joren
55
@Joren, más vale tarde que nunca: 'isNaN' es realmente mejor que v! = V para facilitar la lectura. Pero el código fuente del método isNaN es exactamente el mismo que decir v! = V. Fuente: booleano público estático isNaN (doble v) {return (v! = V); }
Rolf ツ
1
Double.isNaN should be (true) buena respuesta
Oliver Shaw
@Joren isNaN solo revisa v! = V;) pero se ve mejor
Mr Jedi
Usar Java 5: value == Double.NaNno funciona, pero Double.isNaN(value)funciona bien.
zero01alpha
45

Prueba Double.isNaN():

Devuelve true si este valor Double es Not-a-Number (NaN), false en caso contrario.

Tenga en cuenta que [ double.isNaN()] no funcionará, porque los dobles sin caja no tienen métodos asociados con ellos.

Andrew Hare
fuente
Pensé que no se podían llamar métodos en tipos primitivos en Java. Realmente necesita ser Double.isNan()y no double.IsNan(), ¿verdad?
Joren
Joren, confía en el autoboxing (el compilador / tiempo de ejecución convierte el doble en Doble); nueva característica desde 1.5 en adelante. Poco riesgo va en esta dirección; pasar de Doble a doble crea riesgo de NullPointerExceptions.
M1EK
Pensé que el autoboxing solo funcionaba usando el doble como argumento, agregándolo a una colección y cosas por el estilo. Intentar declarar doble x y luego preguntar x a isNaN () - me da un error de compilación.
Carl
Realmente, sospecho que Andrew simplemente perdió la tecla shift escribiendo el primer "doble".
Carl
14

Es posible que desee considerar también verificar si un valor es finito a través de Double.isFinite(value). Desde Java 8 hay un nuevo método en Doubleclase en el que puede verificar de inmediato si un valor no es NaN e infinito.

/**
 * 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
fuente
10

Puede verificar NaN usando var != var. NaNno es igual NaN.

EDITAR : Este es probablemente, de lejos, el peor método. Es confuso, terrible para la legibilidad y, en general, una mala práctica.

Hiperneutrino
fuente
3
¿Alguien puede explicar el voto negativo? Lo sé, este camino es muy malo y isNanes mejor para la legibilidad, pero funciona, ¿verdad? Y el isNanmétodo usa esto para verificar NaN.
HyperNeutrino
1
Supongo que el voto negativo fue porque de esta manera es muy malo, e isNaN es mejor para la legibilidad.
Edward Falk
1
No te rechacé, pero creo que sería útil hacer comentarios adicionales aquí: si comparas envoltorios como Float o Double terminas comparando referencias de esta manera, no con sus valores, que definitivamente no es lo que quieres.
Battle_Slug
3
@Battle_Slug Gracias por el comentario. Sé que es una muy mala idea, pero lo puse aquí para completar.
HyperNeutrino
isNaNhace esto bajo el capó, pero ¿cómo funciona? ¿Cómo algo no se iguala a sí mismo?
wilmol
0

Los principiantes necesitan ejemplos prácticos. prueba el siguiente código.

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
fuente
2
Este ejemplo hace demasiado, y no está claro lo que estaba tratando de mostrar. Esto es solo un montón de código fragmentado.
Jared Hooper
3
Como OP, que era un principiante cuando se hizo esta pregunta en el '09, puedo asegurarle que la respuesta aceptada fue mucho más útil de lo que hubiera sido este ejemplo "práctico".
Eric Wilson
Gracias @pggajendra babu por publicar este código de ejemplo.
fechado el
0

El siguiente fragmento de código ayudará a evaluar el tipo primitivo que contiene NaN.

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

Teela
fuente