1. 程式人生 > >js 小數計算為啥和想象中不一樣!

js 小數計算為啥和想象中不一樣!

++ fix 我只 font 解決辦法 都沒有 丟失 解決辦法。 所有

今天遇到了一個比較有趣的事,如果要你計算0.1+0.2等於多少你會怎麽回答? “0.3啊!”你可能都不會考慮。我也一樣,當a=0.1,b=0.2時 if(a+b === 0.3){...}。我可能等一下午都等不到大括號中的內容被執行。

   為啥呢?因為在js中0.1+0.2=0.30000000000000004。說起來你可能不信,又或者去驗證一下。結果為啥是這樣?在我查找資料之後豁然開朗。對於浮點型數據,大多語言計算都會丟失精度。但是像c++/java這種厲害的語言都有自己封裝的一套方法解決這一問題。js屬於弱類型解釋性語言。大家可以品一品這句話。

  深究一下為啥會丟失精度?那麽就找到了計算機,計算機說我只認識二進制的數。那麽我們就給他二進制數。0.1的二進制表示是

無限循環小數0.0001100110011001100...

0.2的二進制表示是0.0011001100110011...,那麽相加也應該是無限循環小數才對啊!不,雙精度浮點型數據對小數點後最多取52位,所以是 0.01001100110011001100110

01100110011001100110011001100,然後轉化為10進制就是0.30000000000000004。這下是不是就清楚了為啥丟了精度?

雖然會丟失精度,而且js沒有自己封裝解決辦法,但是這些都沒有好關系,因為我相信所有的問題都有對應的解決辦法。js的解決辦法太多。通過Math對象的api。通過Number對象的toFixed。所以這些都不會影響js 的魅力!

2017.8.24 上海!22:10

 

js 小數計算為啥和想象中不一樣!