用Array.prototype.reduce对整数数组求和,是否比Math.sumPrecise更高效?
在JavaScript中对数字数组求和的经典方法是 arr.reduce((a, b) => a + b)。
到了2026年,Math.sumPrecise() 已被加入规范,以比朴素方法更准确地对浮点数列表求和。作为来自Python的人,我习惯用 sum(arr) 对数组求和,而 Math.sumPrecise() 在求和一个整数数组时很有吸引力。
MDN的文档,以及 提案,根本没有提及“整数”这个词。因此,这究竟是否应该用于整数求和,以及性能含义是什么,尚不清楚。
是否有基准测试比较这两种方法的性能?
解决方案
[Math.sumPrecise 提案] 指出如下:
Math.sumPrecise是一个显而易见的名字,但并不显然这将是一个与朴素求和不同(更慢)的算法。为了引起对这种差异的注意,这个被称作Math.sumPrecise。
结合 Barmar的评论,我们可以得出结论:Math.sumPrecise 将会更慢:
JavaScript doesn’t have a distinct integer type; it uses floating point with zero fractions. So there’s no reason to think
sumPrecise()would behave any differently for them。
更具体地说,Math.sumPrecise 规范 实际上要求最大程度正确的答案——也就是如果你进行任意精度运算,然后把结果转换回浮点数,你会得到的答案。这一点可以在“b. Set sum to sum + ℝ(n).”这一行看到。因此,这取决于用于实现该规范的算法。
有趣的是,使用“+”运算符进行数字相加的规范也强制要求同样的事情(“8. Return 𝔽(ℝ(x) + ℝ(y)).”)。在规范方面,主要的区别在于使用 [arr.reduce((a, b) => a + b)] 将在每一步把 [mathematical values] 转换为数字(浮点数)。另一方面,Math.sumPrecise() 尝试尽量保持尽可能正确的和,并且仅在末尾返回“𝔽(sum)”。这导致实现上的差异。