You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:15:07