在 JavaScript 中 0.1 + 0.2 會是多少?為什麼?如何避免相關問題?
2022年9月27日
💎 加入 E+ 成長計畫 如果你喜歡我們的內容,歡迎加入 E+,獲得更多深入的軟體前後端內容
JavaScript 與多數程式語言一樣,當我們把 0.1 + 0.2 時,會出現一個怪異的數字,如果沒有特別做處理的話,可能會產生錯誤;如果是做對數字精確度ㄧ要求高的產品 (例如金融類的產品),這是一定要避免的問題。也因此在 JavaScript 面試中這也是常考的基礎題。
0.1 + 0.2 會是多少?
會是 0.30000000000000004
為什麼會是 0.30000000000000004?
這不是 JavaScript 獨有的現象,而是使用二進制浮點運算的程式語言都會遇到的問題。而 JavaScript 中用到小數點時,因為 JavaScript 是採用 IEEE 754 六十四位元雙精度浮點數,所以會遇到這個問題。
在一般生活中,我們多數情況是使用十進位,而要能夠精確表達十進位,而 10 的質因數是 5 與 2,所以只有 1/2、1/4、1/5、1/8、1/10 這幾個數能夠被十進位的小數清楚表達;而像是 1/3、1/6、1/7、1/9 則不行。以 1/3 來說,我們知道會是 0.33333333 一路到無窮無盡。
而對於二進位制來說,只有 1/2、1/4、1/8 等可以被清楚表達,其他則會無窮無盡地延伸下去,然而因為電腦的記憶體有限,程式語言會分配給一個數字的記憶體也是有限,所以在精准度的表達下會有其限制,這也是導致 0.30000000000000004 這個怪異數字的原因。
該如何避免相關問題?
在 JavaScript 中有 toFixed 以及 toPrecision 等給數字操作的方法,讓我們能夠設定我們要的精確度,舉例來說,可以設定精確到小數第一位。因此
console.log((0.1 + 0.2).toFixed(1)); // 0.3
console.log((0.1 + 0.2).toPrecision(1)); // 0.3
或者可以使用一些熱門的 JavaScript 套件,以下幾個是 GitHub 上星星數多的