Problema con flotante y doble:
Ejemplo 1:
Cálculo incorrecto al restar montos en dólares:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Ejemplo 2:
Error al comprar nueve artículos a 10 centavos cada uno:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Incluso redondeando, los errores persisten.
Problema con los cálculos progresivos, como cuando se compran dulces a precios incrementales de 0,10 a 1,00.
Ejemplo 3:
Error al comprar dulces hasta no tener más dinero:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Solución 1: usar BigDecimal
Ejemplo con BigDecimal:
BigDecimal funds = new BigDecimal("1.00"); BigDecimal price = new BigDecimal("0.10"); int itemsBought = 0; while (funds.compareTo(price) >= 0) { funds = funds.subtract(price); price = price.add(new BigDecimal("0.10")); itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0.00
El cálculo ahora es preciso.
Desventajas de BigDecimal:
Solución 2: usar int o long
Ejemplo con int (en centavos):
int funds = 100; // 1.00 dólar = 100 centavos int price = 10; // 0.10 dólar = 10 centavos int itemsBought = 0; while (funds >= price) { funds -= price; price = 10; itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0
El cálculo es rápido y preciso.
Conclusión:
Opciones:
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3