Java结账程序payment等于含税总价price3时仍提示补款如何修复?
问题根因
你遇到的问题是**double类型的浮点数精度误差**导致等值判断失效:
- Java中
double是二进制浮点数,无法精准存储所有十进制小数,你计算含税总价price3 = price2 * 1.06时,最终结果会存在肉眼不可见的微小偏差 - 比如你预期
price3为28.0,实际存储的可能是27.999999999999996或者28.000000000000004,这时候payment - price3 == 0的判断就会不成立,甚至会因为price3略大于输入的28,触发欠款的else-if分支
修复方案
方案1:改用误差范围判断(适合初学者快速修改)
因为你的金额仅需要精确到分,只需要判断两个金额的差值绝对值小于0.001即可认为等值,修改while循环内的判断逻辑即可:
while(condition == false) { // 差值小于0.001就认为金额相等 if(Math.abs(payment - price3) < 0.001) { condition = true; } // 欠款金额大于0.001才提示补款 else if(price3 - payment > 0.001) { System.out.println(); System.out.printf("You still owe " + "%.2f", (price3-payment)); System.out.println(); System.out.println("I need a better payment!"); payment = input.nextDouble(); } else { condition = true; } }
方案2:使用BigDecimal做金额计算(企业级规范方案)
涉及货币金额的运算不要用double,改用java.math.BigDecimal类做十进制精准运算,从根源上避免精度问题,适合正式项目使用。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

