js-小數計算問題
先上圖:
什麽情況?
原因:js采用二進制進行小數計算
先看十進制的小數轉換為二進制的方法:
十進制數的整數位是二進制數的整數位,十進制數的小數位是二進制數的小數位
假如我們有小數111.4(10),我們對他進行一下計算:
首先取小數位0.4,對其進行“乘二取整法”
0.4*2=0.8 取結果的的整數位置上的數是0 | 按
0.8*2=1.6 取1 | 順
0.6*2=1.2 取1 | 序
0.2*2=0.4 取0 | 寫
0.4*2=0.8 取0 | 出
0.8*2=1.6 取1 |
0.6*2=1.2 取1 |
0.2*2=0.4 取0 |
來到這了,我們發現出現了循環,因此可以推知小數點後的二進制是
0.01100110……(循環0110)
整數就不寫了,方法是除2取余法
題目中2.6+2.6+2.6=7.800000000001,JavaScript中計算小數運算時,都會先將十進制的小數換算到對應的二進制,一部分小數並不能完整的換算為二進制,這裏就出現了第一次的誤差。待小數都換算為二進制後,再進行二進制間的運算,得到二進制結果。然後再將二進制結果換算為十進制,這裏通常會出現第二次的誤差。
解決方法:指定保留幾位小數 (7.8).toFixed(2)=7.80;,這種方法有可能損失精度,網上還有自定義這種加法的方法,加一個鏈接
JS小數運算出現多位小數問題的解決方法
js-小數計算問題