为何Math.floor(1.9)返回1,而Math.floor(1.9999999999999999)返回2?
为什么Math.floor(1.9)返回1,但Math.floor(1.9999999999999999)返回2?
这事儿本质上是JavaScript浮点数的精度限制在搞鬼,咱们一步步拆解来看:
JavaScript采用的是IEEE 754双精度浮点数标准,这种格式只能精确表示有限的十进制小数——大部分带小数的数值在转换为二进制存储时,都会变成无限循环的序列,最终只能被近似存储。
你输入的1.9999999999999999就是典型的例子:它和2.0之间的差值已经小到超出了双精度浮点数能区分的最小范围,所以在JavaScript引擎里,这个数会被直接存储为2.0。当你调用Math.floor()时,本质上是对2.0执行向下取整操作,结果自然就是2了。
咱们用代码验证一下更直观:
console.log(Math.floor(1.9)); // 输出 1 console.log(Math.floor(1.9999999999999999)); // 输出 2 // 直接判断这个数和2.0是否相等 console.log(1.9999999999999999 === 2.0); // 输出 true
如果你的业务场景需要处理高精度的小数运算,建议要么把小数转换为整数进行计算(比如把金额转成分),要么使用专门的高精度数值处理库来避免这类精度问题。
内容的提问来源于stack exchange,提问作者Biswas Khayargoli
相关产品推荐
相关产品推荐

