Проблема с float и double:
Пример 1:
Неправильный расчет при вычитании сумм в долларах:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Пример 2:
Ошибка при покупке девяти предметов по 10 центов каждый:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Даже при округлении ошибки сохраняются.
Проблема с прогрессивными расчетами, например, при покупке сладостей по возрастающей цене от 0,10 до 1,00.
Пример 3:
Ошибка при покупке сладостей, пока у вас не закончатся деньги:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Решение 1. Используйте BigDecimal
Пример с 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
Теперь расчет стал точным.
Недостатки BigDecimal:
Решение 2. Используйте int или long
Пример с целым числом (в центах):
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
Расчет быстрый и точный.
Заключение:
Выбор:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3