Hola, estoy teniendo un incoveniente raro que se produce en una de las pruebas de AlgoBay que nos dan como enunciado. Entendí como funciona el tema de la precisión al trabajar con numeros decimales, pero no entiendo por qué me pasa lo siguiente:
En la prueba
@Testse produce un error en el Assert porque espera 6600.000000000001 y recibe 6600.0
public void test06EnvioBonificadoComprasMayoresA5000() {
AlgoBay algoBay = new AlgoBay();
Producto zapatilla = algoBay.agregarProductoConPrecio("Zapatilla", 2000);
Producto celular = algoBay.agregarProductoConPrecio("Moto 5G", 4000);
Compra compraConEnvioYGarantia = algoBay.crearNuevaCompraConEnvioYGarantia();
algoBay.agregarProductoEnCompra(zapatilla, compraConEnvioYGarantia);
algoBay.agregarProductoEnCompra(celular, compraConEnvioYGarantia);
Assert.assertEquals((6000 * 1.1) + 0,
algoBay.getPrecioTotalDe(compraConEnvioYGarantia),
DELTA);
}
La duda me surge porque, cambiando el precio de los productos para que la suma del precio de los productos de por ejemplo 9000, la prueba funciona correctamente.
Además, todas las demas pruebas pasan bien sin cambiar nada.
Perdón si vuelvo a consultar sobre un tema ya visto, pero no le encuentro la vuelta.
Gracias y un saludo.
Hola de nuevo, cambiando algunas cosas en la implementacion, pude resolver el problema. Lo que no me queda claro es por qué, por ejemplo, Java toma a la cuenta " 9000 * 1.1 " como 9900.0 y a " 6000 * 1.1" lo toma como 6600.000000000001.
Gracias.
Hola Federico,
Cuando hacés una operación así no depende de Java sino del conjunto de instrucciones de la arquitectura del procesador de tu computadora. Al hacer 6000 * 1.1 ambos números son almacenados en el formato IEEE 754 y tendrán distintos exponentes. Dependiendo del algoritmo de multiplicación y de la precisión usados es probable que se pierdan o se redondeen algunos valores de la mantisa de una manera distinta que si usaras el número 9000 (cuya representación en IEEE 754 tendrá un exponente distinto al de 6000).
En una arquitectura z (IBM Mainframe) o en una ARM muy probablemente el comportamiento sea distinto.
De todas formas insisto con que este tema no es relevante para el desarrollo del TP (ni para la materia) y se estudia en detalle en otras materias. Asegurándote de que tu programa haga la operación de la misma manera que la prueba no vas a tener inconvenientes, es decir, multiplicando al precio por 1,1.
Si seguís teniendo mucha curiosidad sobre este tema (y tiempo) te recomiendo este documento: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Saludos,
Tomás