知识卡片
浮点数误差要整数化
内容
二进制浮点数无法精确表示十进制小数,0.1+0.2 不等于 0.3,这是 IEEE 754 标准导致的必然结果,不是 bug。浮点数的整数运算是精确的,可把小数换算成整数运算规避误差,如美元乘100转成美分相加,结果再除100换回美元。发散:金额字段应以最小货币单位(分)存储运算,只在展示层换算元;idea-002 已用 Node.js 实测复现。
参考来源
- 位置:《JavaScript语言精粹(修订版)》附录A《毒瘤 Awful Parts》"浮点数"一节
- 结论依据:原文说明二进制浮点数按 IEEE 754 标准运算,导致 `0.1+0.2` 不等于 `0.3`,同时指出"浮点数中的整数运算是精确的",并给出美元换算美分再相加、最后除以100换算回美元的具体规避方法,据此推出"浮点数误差可通过整数化规避"的结论。
- 原始内容:二进制的浮点数不能正确地处理十进制的小数,因此0.1+0.2不等于0.3……举例来说,美元可以通过乘以100而全部转成美分,然后就可以准确地将美分相加。它们的和可以再除以100转换回美元。