Problema com float e double:
Exemplo 1:
Cálculo incorreto ao subtrair valores em dólares:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Exemplo 2:
Erro ao comprar nove itens de 10 centavos cada:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Mesmo arredondando, os erros persistem.
Problema com cálculos progressivos, como ao comprar doces a preços incrementais de 0.10 a 1.00.
Exemplo 3:
Erro ao comprar doces até não ter mais dinheiro:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Solução 1: Usar BigDecimal
Exemplo com 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
O cálculo agora é preciso.
Desvantagens de BigDecimal:
Solução 2: Usar int ou long
Exemplo com int (em 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
O cálculo é rápido e preciso.
Conclusão:
Escolhas:
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3