javascript(簡稱js)中的數字使用的是國際標準 IEEE 754,由於js是弱類型語言,爲了方便省事,全部數字都是以64位浮點數形式儲存。也就是說,js語言底層根本沒有整數,全部數字都是小數(64位浮點數)!javascript
當咱們開心的進行着整數計算的時候,其實js都在算小數(莫名悲傷)。java
整數算起來時沒有問題的,但當你直接計算小數的時候,就麻煩了:0.1+0.2 不等於0.3es6
1 + 2 === 3 //truecode
0.1 + 0.2 === 0.3 //falseip
0.1 + 0.2 // 0.30000000000000004class
這坑咋回事?循環
原來,0.1是十進制的,轉成2進制之後,就是一個無限循環小數了!簡單來講,就是2進制裏表示1/10的難度跟你在10進制裏表示1/3是同樣同樣的。二進制
十進制的0.1用二進制表示爲:0.0 0011 0011 0011 0011…,循環部分是0011語言
一樣的0.2就是1/5co
十進制0.2用二進制表示爲:0.0011 0011 0011 0011…,循環部分是0011
上邊咱們也說了,用的這個標準,叫IEEE 754,這個標準裏邊,最多存52個尾數,也就是轉換爲科學記數法之後,尾數最多52個,循環小數到這裏就被切斷了,只留下前邊52位。
那這兩個浮點數就不許了啊,就有偏差了,帶着這兩個偏差進行加法計算,獲得的數也就不許了,因此纔會出現
0.1 + 0.2 !== 0.3 //true
反過來講,但凡用二進制表示一個浮點數時,出現了無理數的狀況,這個浮點數運算都是不許的。
哪些浮點數會變成二進制裏的無理數?一個一個記住太麻煩了,只要記住,只要用js算浮點數就會有偏差就行了!
那麼問題來了,咱們若是要用浮點數計算,怎麼搞定這個偏差呢?
能夠設置一個你能夠接受的計算精度來完成啦。es6裏新增的Number.EPSILON就能夠實現啦,這個值就表明了2的負52次方啦
let yourSet = 52 - 10; //精度設置爲小數點後10位小數 let yourTolerance = Number.EPSILON * Math.pow(2, yourSet);
只要保證計算結果偏差小於你設置的偏差就行了,或者你能夠直接用toFixed來去掉多餘的小數位哦。
不知道各位同窗搞明白了嗎?