lunes, enero 15, 2007

Los bugs (II)

Hablando de bugs estúpidos, un caso práctico...

A primeros de diciembre Chuchi se encontró con un serio problema al descubrir que Java no es capaz de multiplicar con precisión... al menos de la forma corriente. Una variable double no nos garantiza que, multiplicada por 100, nos dé el valor esperado (bueno, por 100 porque es un número redondo, pero multiplicada por 12.34 también puede fallar). Tras mucho investigar, descubrimos que se debe a un error de la máquina virtual, que interpreta una serie de bytes como el "bucle periódico", por lo que si coincide con la representación de tus decimales, date por jodido.

Si quieres multiplicar valores decimales sin perder precisión en Java, tienes que hacer uso de la clase BigDecimal, mediante el constructor BigDecimal (String) (si le pasas el double reproduces el error).

Y ahora, a revisar todos los proyectos, uno por uno, donde se usen double para multiplicar cantidades con decimales. Ah, si alguien no se ha creído que esta chapuza es posible, puede probar con 141.48 y multiplicarlo por 100, a ver qué le da ;) En todas partes cuecen habas, está claro.

(Entrada dedicada a Troxer, que ama a Java sobre todas las cosas que odia solamente un poco más que Java)

5 Comentarios:

Blogger Fernando* ha dicho...

14147.999999999

Ein???!?!? ostras O_O

6:08 p. m.  
Blogger Lek ha dicho...

Uno que no me creyó ^^

7:07 p. m.  
Anonymous Anónimo ha dicho...

A mi me da distinto que a fernando*

14147.999999999998

sobre una VM jdk 1.5.0_10 (y a su vez sobre un kernel linux 2.6.18-3-486)

8:43 p. m.  
Anonymous Anónimo ha dicho...

No existe nada que odie más que Java así que... Bueno, a lo mejor a Zapatero :D No sé cuál de los dos es más dañino para mi día a día.

Por cierto, Off-topic total: El año pasado fue el año más caliente de la historia (desde que se registran este tipo de cosas claro). Ahora que vemos a los osos que no hibernan y a los pájaros que tienen las crías que deberían tener dentro de 2 meses, ¿sigues pensando que el cambio climático es un invento de GreenPeace y asociados?

6:30 p. m.  
Blogger Lek ha dicho...

Sí, Troxer, lo sigo pensando. Si este invierno demuestra que el calentamiento climático es una realidad, el pasado demostraba que era una falacia. ¿Has oído lo de El Niño?, parece ser que puede tener mucho que ver con estos "calores" ;)

Y más que a Java yo creo que odias al Barça también ^^

8:46 p. m.  

Publicar un comentario

<< Principal