Author Topic: rarezas del parseFloat y parseDouble  (Read 121 times)

sebotta

  • Newbie
  • *
  • Posts: 18
  • Karma: 0
    • View Profile
rarezas del parseFloat y parseDouble
« on: Julio 17, 2018, 11:44:17 pm »
Hola a todos, Estoy teniendo el siguiente problema, que no es menor, estoy teniendo diferencias de centavos en un sistema, cuando analizo el problema me encuentro que es debido a la conversión a Float hice la siguiente prueba que me dejo muy preocupado:

float a = Float.parseFloat("154721.49");
double b = Double.parseDouble("154721.49");

System.out.println(a);
System.out.println(b);

el resultado fue:

154721.48
154721.49

Aparentemente es un error aleatorio (antes no me había sucedido....creo!?)

Estas pruebas fueron realizadas en dos maquinas con SO Linux.

A alguien le había sucedido esto? Esto sucede solo en Float o tambien sucede en Double? Hay notas al respecto?

Desde ya muchas gracias!

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5447
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: rarezas del parseFloat y parseDouble
« Reply #1 on: Julio 18, 2018, 01:44:58 am »
Hola:

El problema es el siguiente. Un float son 4 bytes, un double son 8 bytes. En un número finito de bytes no puedes representar todos los valores decimales existentes, que son infinitos. Por ello, a partir de una determinada cifra, suelen haber "problemas" con las cifras que van detrás, "redondeos" extraños.

Con cuatro bytes, tienes números de 7 cifras significativas, a partir de la octava te pueden salir cosas raras. (fijate que tu 9 del final es justo la octava cifra). En un double (ocho bytes), son 15 cifras significativas, tendrías problemas a partir de la 16. Da igual que sean decimales o no, tendrías el mismo problema en la octava cifra de un float si es 0.123456789 como si es 123456789.

En la tabla en https://es.wikipedia.org/wiki/Coma_flotante#Formatos_de_coma_flotante tienes estos reflejado, fijate en la columna dígitos significativos en decimal.

Así que si necesitas más de 7 cifras de precisión, usa double. Y si necesitas más de las 15 que te da el double, tendrías que usar la clase BigDecimal de java.

Saludos.

 

ey