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

Java金额更新方法异常:输入超99美分时计算不符合预期

问题分析与修复

先点破核心问题:你在构造函数里调用完updateMoney(cent)之后,又直接把this.dollars和this.cents赋值成传入的原始参数,等于把updateMoney做的所有修改全覆盖了——这就是为啥new Money(15, 300)输出$15.00的原因。

另外,updateMoney里的循环完全没必要,用除法和取余一行就能算完,效率还高。

修正后的完整代码

优化updateMoney方法

把低效的循环替换成数学运算,直接算出要加的美元数和剩余美分:

public void updateMoney(int cent) {
    if (cent > 99) {
        int addDollars = cent / 100; // 超出的美分转成美元,比如300→3
        int remainingCents = cent % 100; // 剩下的不足100的美分,比如300→0
        this.dollars += addDollars;
        this.cents = remainingCents;
    } else {
        this.cents = cent;
    }
}

修正构造函数

先初始化基础美元数,再调用updateMoney,去掉覆盖结果的代码:

public Money(int dol, int cent) {
    if (cent < 0 || dol < 0) {
        System.out.println("Invalid amount entered");
    } else {
        this.dollars = dol; // 先把初始美元存进去
        updateMoney(cent); // 处理美分转换,自动更新dollars和cents
    }
}

为啥之前的代码失效?

  1. 构造函数的执行顺序完全错误:你先调用updateMoney把dollars改成15+3=18、cents改成0,结果转头就执行this.dollars = 15; this.cents = 300;,直接把正确结果覆盖成原始输入了。
  2. 原来的循环虽然能算出结果,但太啰嗦,用cent/100和cent%100是处理货币转换的标准写法,简洁又高效。

补充:如果你的预期是$18.99,那应该是传入的cent为399(399美分=3美元99美分),修复后的代码会正确输出$18.99;如果是300的话,结果就是$18.00,这符合逻辑。

内容的提问来源于stack exchange,提问作者yodichi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:50:54