先上圖: 什麼情況? 原因:js採用二進位進行小數計算 先看十進位的小數轉換為二進位的方法: 十進位數的整數位是二進位數的整數位,十進位數的小數位是二進位數的小數位 假如我們有小數111.4(10),我們對他進行一下計算: 首先取小數位0.4,對其進行“乘二取整法” 0.4*2=0.8 取結果的的整 ...
先上圖:
什麼情況?
原因: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;,這種方法有可能損失精度,網上還有自定義這種加法的方法,加一個鏈接