JavaScript toFixed方法舍入异常:1.535未正确舍入为1.54
JavaScript中toFixed方法的舍入异常原因分析
这不是toFixed的bug,本质是JavaScript的浮点数存储机制导致的精度问题:
- JavaScript采用IEEE 754双精度浮点数标准存储数值,大部分十进制小数无法被精确表示,只能以二进制近似值存储。
- 1.535在内存中实际存储的是一个略小于1.535的近似值(比如
1.5349999999999998),当调用toFixed(2)时,这个值会被向下舍入为1.53。 - 而2.535的二进制近似值则略大于2.535,因此
toFixed(2)会正常向上舍入为2.54。
你可以通过以下代码验证这个差异:
console.log(1.535.toString(2)); // 输出近似的二进制值,能看到它略小于实际的1.535 console.log(2.535.toString(2)); // 输出的二进制值略大于实际的2.535
如果需要精确的四舍五入,可以自己实现逻辑,比如先放大数值再取整:
function preciseRound(num, digits) { const scale = Math.pow(10, digits); return (Math.round(num * scale) / scale).toFixed(digits); } console.log(preciseRound(1.535, 2)); // 输出 "1.54"
内容的提问来源于stack exchange,提问作者Ahmad Echem
相关产品推荐
相关产品推荐

