Math.sumPrecise()

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

Math.sumPrecise() 靜態方法接受一個可迭代物件(iterable)的數字,並返回它們的和。與在迴圈中求和相比,它更精確,因為它避免了中間結果中的浮點精度損失。

試一試

console.log(Math.sumPrecise([1, 2]));
// Expected output: 3

console.log(Math.sumPrecise([1e20, 0.1, -1e20]));
// Expected output: 0.1

語法

js
Math.sumPrecise(numbers)

引數

numbers

一個數字的可迭代物件(例如Array)。

返回值

一個數字,即 numbers 可迭代物件中所有數字的和。如果可迭代物件為空,則返回值為 -0不是 0)。

異常

TypeError

如果 numbers 不是一個可迭代物件,或者可迭代物件中的任何數字不是數字型別。

描述

因為 sumPrecise()Math 的靜態方法,所以你總是透過 Math.sumPrecise() 來使用它,而不是作為你建立的 Math 物件的方法(Math 不是一個建構函式)。

該方法被命名為 Math.sumPrecise(),因為它比在迴圈中天真地求和更精確。考慮以下示例:

js
let sum = 0;
const numbers = [1e20, 0.1, -1e20];
for (const number of numbers) {
  sum += number;
}
console.log(sum); // 0

輸出為 0。這是因為 1e20 + 0.1 無法用 64 位浮點數精確表示,所以中間結果被四捨五入為 1e20。然後,1e20-1e20 的和為 0,因此最終結果為 0

Math.sumPrecise() 透過使用一些特殊的求和演算法來避免這個問題。它的工作方式就像浮點數是使用它們的精確數學值求和一樣,然後最終結果被轉換為最接近的可表示 64 位浮點數。這仍然無法避免 0.1 + 0.2 的精度問題:

js
console.log(Math.sumPrecise([0.1, 0.2])); // 0.30000000000000004

因為浮點數字面量 0.10.2 已經代表了大於 0.10.2 的數學值,而它們的和最接近的 64 位浮點表示實際上是 0.30000000000000004

示例

使用 Math.sumPrecise()

js
console.log(Math.sumPrecise([1, 2, 3])); // 6
console.log(Math.sumPrecise([1e20, 0.1, -1e20])); // 0.1

規範

規範
Math.sumPrecise
# sec-math.sumprecise

瀏覽器相容性

另見