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 可迭代物件中所有數字的和。如果可迭代物件為空,則返回值為 -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.1 和 0.2 已經代表了大於 0.1 和 0.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 |
瀏覽器相容性
載入中…