关于JavaScript中Math.round()方法的数值舍入疑问
JavaScript中Math.round结果不符合预期的原因
先看测试代码:
let result; result = 2.4999999999999998; console.log(Math.round(result)); result = 2.4999999999999997; console.log(Math.round(result));
出现这种结果的原因可以拆成两点来看:
- 双精度浮点数的存储限制
JavaScript采用IEEE 754双精度浮点数存储数值,这种格式的精度是53位二进制有效数字,对应十进制约15-17位有效数字,但并非所有十进制小数都能被精确转换为二进制浮点数:
2.4999999999999998和2.5的差值极小,小于双精度浮点数能区分的最小间隔(即Number.EPSILON,约为2.22e-16),因此JS会直接把它近似存储为2.5。2.4999999999999997和2.5的差值刚好超过这个最小间隔,所以它会被存储为一个略小于2.5的真实浮点数。
- Math.round的舍入规则
Math.round的逻辑是返回最接近输入值的整数,当输入值刚好处于两个整数中间(比如2.5)时,会优先返回偶数。所以:
- 被存储为
2.5的2.4999999999999998,经过Math.round处理后得到2。 - 略小于
2.5的2.4999999999999997,经过Math.round处理后得到2。
这就是为什么两个看起来接近2.5的数,最终舍入结果都不是你预期的3。
内容的提问来源于stack exchange,提问作者user6874272
相关产品推荐
相关产品推荐

