浮點數相加
浮點數
在日常生活中,如果要計算 0.1 + 0.2,我們能夠直覺的答出 0.3 這個答案。
但是在 JavaScript 中,計算結果卻不如預期,用 console.log(0.1 + 0.2 === 0.3)
回傳的結果竟會得到 false
。
其實這和電腦的「IEEE754 二進制浮點運算」計算方式有關,當我們宣告一段浮點數陣列,展開後會發現,有些浮點數會有些微誤差,以致於在進行計算時會出錯。
所以得到的結果自然是 0.1 + 0.2 !== 0.3
。
1 | var num = Array.from(Array(10).keys()) |
該如何解決浮點數問題呢?可以使用以下兩種方法:
- Number.toFixed()
- Number.toPrecision()
Number.toFixed
Number.toFixed()
可以對數字進行四捨五入到指定的第 N 位數。
toFixed()
方法回傳的型別是「字串」,需要另外再轉換為數字型別。
1 | var num = 10.12345 |
同樣方法用在浮點數上可以改成:
1 | var num = Array.from(Array(10).keys()) |
如果想去除小數點後為 0 的尾數,則可以用 parseFloat()
。
1 | var num = 0.990 |
Number.toPrecision
Number.toPrecision()
方法可以指定想要顯示的浮點數範圍,範圍在 1~21,並且回傳「字串」。toPrecision()
方法有以下幾種狀況:
1 | // 1. 數字是浮點數,就會補 0 |
所以如果想要解決浮點數相加的問題,可以改成這樣:
1 | parseFloat((0.1 + 0.2).toPrecision(12)) // "0.3" |
至於為什麼參數要帶 12,因為 12 位數可以避免大部分浮點數的問題。