C++编写找零计算程序运行结果与预期不符问题咨询
找零计算错误问题分析与修复
问题根源
核心是二进制浮点数的精度丢失问题:
double类型是二进制存储,0.65、0.95这类十进制小数无法被精准表示,实际计算0.95 - 0.65的结果不是精确的0.3,而是约等于0.2999999999999998的近似值- 你直接将差值乘以100后强转为
int时,会直接截断小数部分,本该等于30的找零分就被错误截断为29,后续计算自然得到1个25分、剩余4分的错误结果,和你看到的输出完全吻合。
修复方案
快速修复方案
在转换为整数时增加极小的偏移量抵消浮点误差,修改change计算行即可:
// 增加0.001分的偏移量,不会影响正常计算结果,同时解决截断误差 int change = static_cast<int>((x - y) * 100 + 0.001);
最优实践方案
金融、金额类计算场景下,完全避免使用浮点数存储金额,全程用整数单位(分)做存储和计算,从根源上杜绝精度问题:
- 输入时可直接读取金额的整数分,或者将输入的浮点值先加偏移转成整数分后再做后续所有运算
另外你代码里的硬币拼写存在小问题:Penney应为Penny,复数形式是Pennies。
内容的提问来源于stack exchange,提问作者Matt_Ag
相关产品推荐
相关产品推荐

