在 JavaScript 中 0.1 + 0.2 會是多少?為什麼?如何避免相關問題?

2022年9月27日

💎 加入 E+ 成長計畫 與超過 300+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

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 上星星數多的

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們