Problem with float and double:
Example 1:
Incorrect calculation when subtracting dollar amounts:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Example 2:
Error when purchasing nine items for 10 cents each:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Even rounding, errors persist.
Problem with progressive calculations, such as when purchasing sweets at incremental prices of 0.10 to 1.00.
Example 3:
Error when buying sweets until you have no more money:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Solution 1: Use BigDecimal
Example with 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
The calculation is now precise.
Disadvantages of BigDecimal:
Solution 2: Use int or long
Example with int (in cents):
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
The calculation is fast and accurate.
Conclusion:
Choices:
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3