C++实现银行家舍入法:修改DollarAmount类复利计算逻辑问题
C++ 银行家舍入法实现修复方案
核心问题定位
你现有逻辑的问题出在判断时机错误:先完成了常规四舍五入再判断银行家舍入触发条件,此时小数部分为0.5的场景已经被提前进位,对应判断分支自然无法触发。
实现逻辑修正
银行家舍入的正确判断流程:
- 先计算整除的商和余数
- 余数大于0.5单位时正常进位
- 余数小于0.5单位时不进位
- 余数恰好等于0.5单位时,判断商的奇偶性:奇数进位,偶数保持原值
代码修改示例
假设你使用的教材示例中DollarAmount类用整数amount存储总分数(避免浮点数误差,1元对应100),修改后的addInterest方法如下:
// 原方法入参:rate为利率,divisor为除数(固定为100对应百分比计算) void DollarAmount::addInterest(int rate, int divisor) { // 转long long避免整数溢出 long long total = static_cast<long long>(amount) * rate; int quotient = total / divisor; int remainder = total % divisor; int half = divisor / 2; if (remainder > half) { quotient++; } else if (remainder == half) { // 仅当余数恰好为0.5单位时,向偶数舍入 if (quotient % 2 != 0) { quotient++; } } amount += quotient; }
divide方法可复用完全一致的判断逻辑,仅需修改计算商和余数的输入即可。
测试用例验证
- 输入2 100(利率2%,初始本金100元):按上述逻辑计算10年复利,最终总分为121898,对应输出
1218.98,符合预期 - 输入5 1000000(利率5%,初始本金1000元):利息计算时余数恰好为除数的1/2,商为0(偶数),因此利息始终为0,余额保持1000元,符合预期
内容的提问来源于stack exchange,提问作者user15194704
相关产品推荐
相关产品推荐

