float 和 double 问题:
示例1:
减去美元金额时计算错误:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
示例2:
以每件 10 美分的价格购买 9 件商品时出错:
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 示例(以分为单位):
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
计算又快又准。
结论:
选择:
以上是如果需要准确答案,请避免浮动和双精度的详细内容。更多信息请关注PHP中文网其他相关文章!