跳到主要內容

JavaScript 浮點數計算的精確作法

這是程式中的常見問題
也大概會有很多程式入門者覺得很奇怪

JavaScript 中的 0.1 + 0.2 的結果是 0.30000000000000004 而不是 0.3
原因是 JavaScript 處理浮點數的運算方式是用2進位
所以就是會有浮點數值無法正確用2進位表示,而產生誤差
細節可以參考 IEEE 754 這個規範
順便一提,當然也不是只有JavaScript採用2進位
如果接觸新語言也可以查該語言的相關處理方式,說不定能一開始就避免問題

處理方式一般大致有幾種
1. 引入Library,有好幾個數學方面的Library能處理
    不過引入Library總是有好有壞,視狀況自行評估

2. Number.prototype.toFixed()
    MDN 有很多範例可以看了
    不過有個小問題是,因為它會產生補0到指定位數為止的文字
    如果你並不想要文字面顯示 1.100 ,而是顯示 1.1 就好的話
    那麼還需要多一道手續
 
3. Math.round
    在不需要到非常長的小數點後位數的浮點數運算時,這是我比較常採用的方式
    雖然浮點數運算會有這問題
    但如果我們只是把一個整數除整數則沒有這問題
    所以就能像這樣用 Math.round(result * 100000) / 100000;
    先把數字變成更大的數值在去掉不想要的尾數變成整數後,再縮回原本位數
    100000只是示範值,可以根據需要的精確度調整
    這樣只要簡單的一行就可以處理了

留言