1. 程式人生 > >Javascript裡的浮點數

Javascript裡的浮點數

今天做需求的時候碰到一個之前從未注意過的小問題,在這裡記錄一下
假設有一段程式碼是這樣的:

if (0.4+0.3+0.2+0.1 == 1) {
    // do something...
}

你滿心希望這個判斷條件可以讓你do something,但是……結果是你永遠進不到這個if裡面
這個就很恐怖了,於是你打算檢查一下

 console.log(0.4+0.3+0.2+0.1)

好的,結果是0.9999999999999999

那麼這是為什麼呢!下面是揭祕環節!

我們知道,JS裡所有數字,無論整型還是浮點,都是Number格式,即IEEE754標準裡的64位二進位制浮點數。
看到這裡應該一些學過計組的同學就會大概明白原因了,這裡再舉一個通俗一點的例子
Q:十進位制浮點小數是怎麼轉化為二進位制的呢?
A:對十進位制小數乘2得到的整數部分和小數部分,整數部分既是相應的二進位制數碼,再用2乘小數部分(之前乘後得到新的小數部分),又得到整數和小數部分。如此不斷重複,直到小數部分為0或達到精度要求為止。
所以我們知道,十進位制小數轉成二進位制時,除非十進位制小數是1/2^n

,那麼,轉化所得的二進位制小數必然是一個近似的無限小數!
又因為64位的精度限制,導致這個近似的小數會被截斷,造成精度上的損失,進而導致計算結果的偏差

那麼,解決方案就很簡單啦,只需要限定輸出結果的精度就可以了~
Solution:

// Number.toPrecision()設定了浮點數精確到小數點後第幾位
if (parseFloat((0.4+0.3+0.2+0.1).toPrecision(10)) == 1) {
    // do something...
}