2010-05-29 27 views
5

¿Alguien podría decirme por qué la salida del siguiente programa no es "diferente diferente"?Números flotantes en Java

public static void main(String[] args) 
{ 

float f1=3.2f; 
float f2=6.5f; 

if(f1==3.2) 
System.out.println("same"); 
else 
System.out.println("different"); 

if(f2==6.5) 
System.out.println("same"); 
else 
System.out.println("different"); 
} 

O/P: diferentes misma

+0

¿por qué debería ser? –

Respuesta

11

6.5 tiene una representación binaria finita: 110,1

Cualquier tipo flotante con al menos 4 bits significativos puede representar este número perfectamente.

110,100000000000000000000 (float)
= 6,5

110,10000000000000000000000000000000000000000000000000 (doble)
= 6,5

3,2 por otro lado tiene una representación binaria infinita: 101.0011001100110011 ...

float y double no tiene una precisión infinita y, por lo tanto, solo puede aproximarse a este número :(

101,001100110011001100110 (float)
= 3,2000000476837158203125

101,00110011001100110011001100110011001100110011001101 (doble)
= 3,20000000000000017763568394002504646778106689453125

Como se puede ver claramente, estos números no son lo mismo!

+0

+1 para ti porque es la única respuesta que realmente responde la pregunta. No sé por qué el OP aceptó la otra respuesta que definitivamente no explica por qué una prueba dio * "lo mismo" * y la otra * "diferente" *. – NoozNooz42

+2

Solo agregaría que la otra razón para esto es que Java promueve tipos menos precisos a tipos más precisos para comparación, lo que hace posible la comparación de 3.2 y 3.2f. Si se trunca el tipo más largo aquí, estos serían los mismos, pero afortunadamente (como C) usa * ampliando conversiones primitivas * para hacer lo que la mayoría de la gente probablemente esperaría: http://bit.ly/d8Yx3N – tgamblin

+0

@ NoozNooz42: Hey , Lo tengo correcto también (: –

1

This puede ayudar a entender

3

Debido 3.2f es un valor float y 3.2 es un valor double. Los números flotantes siempre son un poco imprecisos porque la representación binaria no puede implementarlos con precisión, por lo que compararlos para una igualdad exacta es una mala idea. Particularmente comparando carrozas con dobles. Expresiones como 3.2f == 3.2f generalmente están bien, pero incluso aquellas pueden fallar en algunos idiomas, p. si representan números en los registros de forma más precisa que en la memoria.

+0

+1 porque esta explicación es mucho más exhaustiva de lo que me molesté en escribir. :) – edl

+0

Creo que la pregunta es por qué uno de ellos debería ser igual. El OP espera que ambos sean desiguales. –

+3

"Los números de coma flotante son * siempre * ligeramente imprecisos" -> incorrectos. float y double pueden representar fracciones con representaciones binarias finitas como 6.5. Ver mi respuesta para más detalles. – fredoverflow

0

"3.2f" es un tipo de flotador. "3.2" es de tipo doble.

0

Además, creo que cualquier cosa con un decimal predeterminado es un doble, por lo que cuando haces una comparación, tienes que agregar 'f' y también if(f2==6.4f).

5

Porque 3.2 no es representable exactamente como el número de punto flotante y 6.5 es (pista: 6.5 = 13 * 2^(- 1)), así como el hecho de que 3.2 es un literal double pero 3.2f es un literal float .

Cuestiones relacionadas