1. 程式人生 > >js-小數計算問題

js-小數計算問題

部分 二次 www. get class tle 計算 技術分享 .com

先上圖:

技術分享

什麽情況?

原因: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-小數計算問題