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 } }
为啥之前的代码失效?
- 构造函数的执行顺序完全错误:你先调用
updateMoney把dollars改成15+3=18、cents改成0,结果转头就执行this.dollars = 15; this.cents = 300;,直接把正确结果覆盖成原始输入了。 - 原来的循环虽然能算出结果,但太啰嗦,用
cent/100和cent%100是处理货币转换的标准写法,简洁又高效。
补充:如果你的预期是$18.99,那应该是传入的cent为399(399美分=3美元99美分),修复后的代码会正确输出$18.99;如果是300的话,结果就是$18.00,这符合逻辑。
内容的提问来源于stack exchange,提问作者yodichi
相关产品推荐
相关产品推荐

