2026年7月27日 星期一

關於 Math.sumPrecise()

 關於 Math.sumPrecise()

前言

  Math.sumPrecise() 看說明是為了解決連續加浮點數造成的誤差問題,但實際用起來似乎有些問題,在此把學習的過程做個紀錄。


內容

  範例如下

console.log( Math.sumPrecise( [0.1, 0.2] ) );//0.30000000000000004
console.log( Math.sumPrecise( [0.1, 0.2, 0.3] ) );//0.6
console.log( Math.sumPrecise( [0.1, 0.2, 0.3, 0.4 ] ) );//1.0
//
let ar1 = [0.1, 0.2];
let ar2 = [0.1, 0.2, 0.3];
let ar3 = [0.1, 0.2, 0.3, 0.4];
console.log( ar1.reduce((a, b) => a + b, 0) );0.30000000000000004
console.log( ar2.reduce((a, b) => a + b, 0) );0.6000000000000001
console.log( ar3.reduce((a, b) => a + b, 0) );1


Math.sumPrecise() 的用法很簡單,引數只支援輸入一個陣列,並不支援多個引數的輸入,透過回傳值取得加完後的結果,範例分別示範了三種狀況,但在第一個狀況就發生有精度的問題!而且這個狀況是符合規格的,在 [ developer.mozilla.org ] Math.sumPrecise() 有說這是合理的結果,所以使用 Math.sumPrecise() 還是有精度的問題要解決,算是只解決一半,最後範例分別把三種狀況使用直接加的方式呈現,可以跟開始的三個示範做比較。


  感覺 Math.sumPrecise() 並不可靠,問題只解決一半,也許日後的版本會解決這個問題,現在還是不建議使用。


參考資料

[ developer.mozilla.org ] Math.sumPrecise()

沒有留言:

張貼留言