JavaScript中使用+=的for循环无法生成精确数值?原因与解决办法
问题原因
JavaScript采用IEEE 754双精度浮点数存储数值,而0.1这类十进制小数无法被精确转换为二进制浮点数——它在二进制中是无限循环的小数。当你在循环里反复累加0.1时,这些微小的精度误差会不断累积,最终导致数组中出现-9.700000000000001这类偏离预期的数值。
解决方法
方法1:用整数循环再转小数(最可靠)
避开浮点数累加的坑,改用整数作为循环变量,最后除以10得到精确的目标小数:
let array = []; // 对应-10到10,步长0.1,整数范围就是-100到100 for (let i = -100; i <= 100; i += 1) { array.push(i / 10); } console.log({array});
这种方法从根源上消除了精度误差,生成的数值完全符合预期。
方法2:对浮点数做精度修正
如果非要用浮点数循环,可以在每次存入数组前对数值进行精度处理:
let array = []; let i = -10; while (i <= 10) { // 保留1位小数,再转成数值类型 array.push(Number(i.toFixed(1))); i += 0.1; } console.log({array});
注意toFixed()返回的是字符串,需要用Number()转回数值。不过这种方法在极端场景下可能仍有微小误差,不如整数循环稳妥。
内容的提问来源于stack exchange,提问作者Timothy Ong
相关产品推荐
相关产品推荐

