缩放法通过将浮点数乘以固定倍数转为整数运算,再除回原倍数,规避ieee 754精度误差;例如0.1和0.2各乘100得10与20,相加得30,再除100得精确0.3。

JavaScript 中没有内置的“缩放法”整数转换机制,但开发者常通过乘除固定倍数(如 10、100、1000)将浮点数“放大”为整数参与运算,再“缩小”还原,以此规避浮点误差。核心思路是:把小数转成整数做计算,最后按相同倍数缩回。
为什么需要缩放法?
JavaScript 使用 IEEE 754 双精度浮点数表示数字,导致像 0.1 + 0.2 !== 0.3 这类经典问题。直接用浮点数做加减、比较或累计运算易出错,尤其在金融、计费、库存等对精度敏感的场景。
缩放倍数怎么选?
取决于原始数据的小数位数和业务精度要求:
- 金额(元)通常保留 2 位小数 → 缩放倍数用 100(单位转为“分”)
- 温度、传感器读数保留 3 位小数 → 倍数常用 1000
- 避免动态计算倍数(如
Math.pow(10, decimalPlaces)),优先用字面量常量,更安全、可读性高
典型操作流程
以“0.1 + 0.2”为例,按缩放法转整数计算:
- 放大:0.1 × 100 = 10,0.2 × 100 = 20
- 整数运算:10 + 20 = 30
- 缩小:30 ÷ 100 = 0.3(结果正确)
封装成函数更实用:
function addFixed(a, b, scale = 100) {return (Math.round(a * scale) + Math.round(b * scale)) / scale;
}
注意事项与常见陷阱
缩放法不是万能解,需注意:
-
必须四舍五入放大:用
Math.round()而非Math.floor()或直接截断,否则会累积舍入偏差 -
避免链式浮点输入:如果 a、b 本身已是浮点误差结果(如
0.1 + 0.2得到0.30000000000000004),应尽早缩放,不要在误差已产生后再处理 -
除法慎用缩放法:整数除法仍可能产生新浮点数(如 1 ÷ 3),此时需结合
toFixed()或专用库(如decimal.js) -
大数溢出风险:过度缩放(如 scale=1e15)可能导致整数超出
Number.MAX_SAFE_INTEGER,引发精度丢失
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











