You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:48:15