¿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?

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 .


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.


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)

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.


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

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;

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.