JavaScript中Math.round计算二维数组列均值时四舍五入异常
问题原因
这不是JavaScript的底层Bug,是你写的函数存在逻辑错误:你把Math.round放在了reduce累加循环的内部,相当于对每一个元素除以长度后的分项值单独做四舍五入,再把取整后的结果相加,而不是先算出完整的平均值再做一次取整。多次提前取整产生的误差会在累加过程中叠加,最终结果自然不符合预期。
拿计算出错的第二列数据举例,第二列原始值为[10, 179, 223, 53, 209, 94],共6个元素,按你原来的代码逻辑,每个值除以6后单独取整的结果为:
- 10/6 ≈ 1.67 → 取整为2
- 179/6 ≈ 29.83 → 取整为30
- 223/6 ≈ 37.17 → 取整为37
- 53/6 ≈ 8.83 → 取整为9
- 209/6 ≈ 34.83 → 取整为35
- 94/6 ≈ 15.67 → 取整为16
把这些提前取整的值相加:2+30+37+9+35+16 = 129,正好是你得到的错误结果。你单独测试Math.round(127.99999999999999)返回128是完全正常的——因为127.999...才是所有分项不提前取整、累加得到的真实平均值,你的旧代码根本没有算出这个真实值,自然也轮不到Math.round去处理这个数。
正确写法
计算平均值后取整的正确逻辑是:先累加所有分项值算出精确的平均值,最后对最终的平均值做一次四舍五入即可,不要在计算中途对中间值取整。修正后的代码如下:
const nums = [[ 20,10,35 ],[70,179,30],[207,223,8],[38,53,52],[234,209,251],[35,94,2]] const avg = (arr) => arr[0].map((_,i) => Math.round(arr.reduce((sum,v) => sum + v[i]/arr.length,0))); console.log(avg(nums)); // 输出 [101, 128, 63],结果符合预期
内容的提问来源于stack exchange,提问作者noirsociety
相关产品推荐
相关产品推荐

