what variable tipos assignment array java literals

tipos - variables java oracle



¿Por qué es 0.5== 0.5f es verdadero pero 0.1== 0.1f es falso? (2)

Esta pregunta ya tiene una respuesta aquí:

Por favor, mire los siguientes dos códigos:

public static void main(String... args) { System.out.println(0.5==0.5f); }

Salida: verdadero

public static void main(String... args) { System.out.println(0.1==0.1f); }

Salida: falso

¿Por qué sucede así?


Estás comparando dos tipos de valores: doble y flotante. Piensa en las limitaciones de tamaño con números inexactos.

Un ejemplo:

Valores exactos (decimal)

value1 -> 1/2 con 5 decimales es 0.50000
value2 -> 1/2 con 10 decimales es 0.5000000000

entonces

value1 == value2 -> devuelve true

Valores inexactos (decimal)

value3 -> 1/3 con 5 decimales es 0.33333
value4 -> 1/3 con 10 decimales es 0.3333333333

entonces

value3 == value4 -> devuelve falso porque no son lo mismo.

0.1 no puede representarse exactamente en binario (como 1/3 en decimal) pero 0.5 puede ser.

La representación binaria de 0.1d -> 0.000 (1100) 1100110011 ...
La representación binaria de 0.5d -> 0.1


Esto tiene que ver con el hecho de que los números de punto flotante están representados en la forma c*2^q . 0.5 se puede representar como 1*2^-1 mientras que 0.1 es imposible de representar con precisión independientemente de qué tan grande sea c y q.

Cuando se compara un flotador con un doble, el flotador se convierte en un doble. Si el número que se representa ya se puede representar correctamente como un flotador, tendrá el mismo valor cuando se emita como doble, pero si no, el doble tendrá algunos dígitos significativos adicionales y, por lo tanto, se comparará como no igual.