为什么JavaScript中该方法无法得到正确的0.25的倍数?
问题原因
- 循环增量配置错误:你当前for循环用的是
i++,每次执行会给i加1,而非你需要的0.25,所以遍历到的数值只有0.25、1.25、2.25、3.25...,自然只会匹配到这几个符合模0.25等于0的结果 - 浮点数精度风险:直接对浮点数做取模运算容易因为二进制存储精度问题出现判断误差,比如
0.1 + 0.2 !== 0.3就是典型的浮点数精度问题,长期累加后你的取模判断很可能失效 - 逻辑冗余+输出位置错误:循环内
i>3就执行continue的逻辑会跳过大于3的数值的后续判断,另外console.log放在循环内部会每次循环都打印数组的中间状态,不会直接输出最终结果
修复方案
推荐用整数循环的方案彻底规避浮点数精度问题,代码如下:
let arr1 = [] // 从1到12对应0.25*1=0.25到0.25*12=3,按需调整上限即可 for (let i = 1; i <= 12; i++) { arr1.push(i * 0.25) } console.log(arr1) // 输出 [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3]
如果你要保留原来的浮点数遍历写法,调整增量即可,注意加精度容错处理:
let arr1 = [] const precision = 1e-8 // 处理浮点数精度误差 for (let i = 0.25; i <= 3; i += 0.25) { // 增量改0.25,上限直接设3,不需要额外continue判断 if (Math.abs(i % 0.25) < precision) { arr1.push(i) } } console.log(arr1)
内容的提问来源于stack exchange,提问作者seyi
相关产品推荐
相关产品推荐

