2011-07-28 13 views
5

me encontré con el siguiente programaExplicación de salida de un programa java

class Boolean { 
    public static void main(String argv[]) { 
    boolean x; 
    x = 4.4f == 4.4; 
    System.out.println(x); 
    } 
} 

La salida del siguiente programa es false

Pero si escribimos el programa de la siguiente manera, a continuación,

class Boolean { 
    public static void main(String argv[]) { 
     boolean x; 
     x = 4.5f == 4.5; 
     System.out.println(x); 
    } 
} 

En este caso, la salida es true

¿Alguien puede explicarme por qué?

+3

posible duplicado de [¿Qué hay de malo en usar == para comparar flotantes en Java?] (Http://stackoverflow.com/questions/1088216/whats-wrong-with-using-to-compare-floats-in-java) –

+0

Otras preguntas similares: [1] (http://stackoverflow.com/questions/2896013), [2] (http://stackoverflow.com/questions/6837007) –

Respuesta

3

Por lo general, no debe comparar los valores de coma flotante con el operador ==. Debe utilizar 'lo suficientemente cerca' la comparación como la comprobación de si los valores difieren en algún valor pequeño:

double epsilon = 0.000001

boolean equal = Math.abs(value1-value2) < epsilon

En su ejemplo, 4.4f no es igual a 4.4, porque Java predetermina los valores de coma flotante a tipo doble, que es de 64 bits, y para compararlos java proyecta 4.4f al doble, lo que hace que sea ligeramente diferente del valor doble original 4.4 (debido a problemas que representan fracciones decimales con binario)

Aquí hay un buen link en números de coma flotante.

0

Esto se debe a un error de redondeo cuando el doble se trunca en un flotador. A veces lo recibes a veces no lo harás.

4.4f es un flotador y 4.4 es un doble.

1

El problema es que a las computadoras les gustan los números basados ​​en la base 2 y no en la base 10 como nosotros.

4.4 es una fracción infinita (como 0.333333333 ... para nosotros) en binario, y los flotantes tienen menos dígitos que los dobles, por lo que hay menos dígitos en 4.4f que en 4.4, lo que los hace diferentes.

4.5 no es una fracción infinita.

Nota: Cuando necesite comparar flotadores o dobles, siempre debe verificar el tamaño de la diferencia, no solo verificar la igualdad.

0

Su prgramm compara un flotador de 16 bits con un valor doble de 32 bits. Internamente se representa como IEEE754, por lo que la diferencia es un error de redondeo que en algunos casos conduce a esta desigualdad debido a la diferente precisión.

0

Esto se debe al hecho de que un flotador no es un doble y no es fácil hacer una comparación directa, porque un flotador es solo una aproximación. Echar un vistazo al siguiente código:

public static void main(String args[]) { 
    double a, b; 

    a = 4.4f; 
    b = 4.5f; 
    System.out.println("4.4f implicitly cast to a double = "+a); 
    System.out.println("4.5f implicitly cast to a double = "+b); 

    } 

verá que 4.4f, cuando se convierte implícitamente a una doble es de hecho 4.400000095367432.

1

Ejecutar este código para ver cómo casting de flotación a las obras dobles para estos casos

NumberFormat nf = new DecimalFormat("0.00000000000000000000"); 

    System.out.println(nf.format(4.4f)); 
    System.out.println(nf.format(4.4)); 

    System.out.println(nf.format(4.5f)); 
    System.out.println(nf.format(4.5)); 
0

Además de lo que todo el mundo ha dicho, aquí es un ejemplo muy popular para demostrar esto con operaciones de punto flotante.

System.out.println(0.3 - 0.2 - 0.1); 

No imprimirá 0. De hecho, imprimiría un número muy pequeño como resultado de los errores de truncamiento que ocurren en operaciones de punto flotante cuando ciertas fracciones no se repiten en la representación binaria.

Cuestiones relacionadas