天天看點

JS中0.1+0.2!=0.3

在控制台輸入0.1+0.2,會得出以下結果

JS中0.1+0.2!=0.3

即不等于0.3。下面我們說一下原因。

一、存儲原理

1.在計算機中數字無論是定點數還是浮點數都是以多位二進制的方式進行存儲的。

2.在JS中數字采用的IEEE 754的雙精度标準進行存儲(存儲一個數值所使用的二進制位數比較多,精度更準确)。

二、示例

在定點數中,如果我們以8位二進制來存儲數字。

對于整數來說,十進制的35會被存儲為: 00100011 其代表 2^5 + 2^1 + 2^0。

對于純小數來說,十進制的0.375會被存儲為: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375

對于像0.1這樣的數值用二進制表示你就會發現無法整除,最後算下來會是 0.000110011…由于存儲空間有限,最後計算機會舍棄後面的數值,是以我們最後就隻能得到一個近似值。

JS中采用的IEEE 754的雙精度标準也是一樣的道理在存儲空間有限的情況下,當出現這種無法整除的小數的時候就會取一個近似值,在js中如果這個近似值足夠近似,那麼js就會認為他就是那個值。

console.log(0.1000000000000001) 
// 0.1000000000000001 (中間14個0,會列印出本身)
console.log(0.10000000000000001) 
// 0.1 (中間15個0,js會認為兩個值足夠近似,是以輸出0.1)      

由于0.1轉換成二進制時是無限循環的,是以在計算機中0.1隻能存儲成一個近似值。

另外說一句,除了那些能表示成 x/2^n 的數可以被精确表示以外,其餘小數都是以近似值得方式存在的。

在0.1 + 0.2這個式子中,0.1和0.2都是近似表示的,在他們相加的時候,兩個近似值進行了計算,導緻最後得到的值是0.30000000000000004,此時對于JS來說,其不夠近似于0.3,于是就出現了0.1 + 0.2 != 0.3 這個現象。當然,也并非所有的近似值相加都得不到正确的結果。

三、解決方法

方式一: 想辦法規避掉這類小數計算時的精度問題就好了,那麼最常用的方法就是将浮點數轉化成整數計算。因為整數都是可以精确表示的。

0.1+0.2 => (0.1*10+0.2*10)/10      

方式二 : js的Number對象有一個保留小數位數的方法:toFixed();傳入一個需要保留的位數就OK:

(0.1+0.2).toFixed(10)==0.3      

繼續閱讀