C语言中double类型数值乘100后存入int变量结果错误如何处理?
问题原因排查
核心诱因:浮点数精度截断误差
C语言中double类型是二进制浮点数,无法精确存储部分十进制小数,例如你计算场景中的0.02,实际存储的是接近0.02的近似值(大约为0.019999999999999997)。当执行money*100操作时,实际计算结果为1.9999999999999996而非精确的2。
而double转int类型时默认执行截断取整,也就是直接舍弃小数部分,所以1.9999999999999996转int后就得到了1,和你预期的2不符。
修复方案
- 临时修复:浮点转整数前添加微小偏移量抵消精度误差,修改乘法行代码为:
// 1e-6是远小于1分的误差值,可抵消常规浮点精度偏差 temp = (int)(money * 100 + 1e-6);
- 最优方案:货币计算避免使用浮点数,直接用整数类型存储单位为分的金额,所有运算全程用整数执行,从根源上杜绝浮点精度问题。比如输入1.23元时直接转换为整数
123分参与计算,无需任何浮点转换操作。
额外注意
你当前代码中money -= ((double)temp / 100)的操作会持续累积浮点误差,即使临时修复了单次转换问题,多次运算后仍可能出现结果偏差,建议优先更换为整数存分的方案。
内容的提问来源于stack exchange,提问作者frowit
相关产品推荐
相关产品推荐

