中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么JS中0.1+0.2 != 0.3?

發布時間:2020-08-11 03:18:54 來源:ITPUB博客 閱讀:276 作者:ii_chengzi 欄目:web開發

   JS中數字運算時,有一個叫做 數字運算中的精度缺失的問題,這篇文章,就帶著大家了解下JS運算中精度的缺失問題。

  首先我們先來看一個例子:

  

為什么JS中0.1+0.2 != 0.3?


  這里0.1 + 0.2 != 0.3 這個就是我們要解決的問題了。

  要弄清這個問題的原因,首先我們需要了解下在計算機中數字是如何存儲和運算的。在計算機中,數字無論是定點數還是浮點數都是以多位二進制的方式進行存儲的。

  在JS中數字采用的IEEE 754的雙精度標準進行存儲,我們可以無需知道他的存儲形式,只需要簡單的理解成就是存儲一個數值所使用的二進制位數比較多而已,這樣得到的數會更加精確。

  這里為了簡單直觀,我們使用定點數來說明問題。在定點數中,如果我們以8位二進制來存儲數字。

  對于整數來說,十進制的35會被存儲為: 00100011 其代表 2^5 + 2^1 + 2^0。

  對于純小數來說,十進制的0.375會被存儲為: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375

  而對于像0.1這樣的數值用二進制表示你就會發現無法整除,最后算下來會是 0.000110011....由于存儲空間有限,最后計算機會舍棄后面的數值,所以我們最后就只能得到一個近似值。

  在JS中采用的IEEE 754的雙精度標準也是一樣的道理,我們且不管這個標準下的存儲方式跟定點數存儲有何不同,單單在這一點上他們都是相同的,也就是存儲空間有限,當出現這種無法整除的小數的時候就會取一個近似值,在js中如果這個近似值足夠近似,那么js就會認為他就是那個值。

  比較拗口,舉個例子:

  

為什么JS中0.1+0.2 != 0.3?


  所以我們現在應該可以理解,就是說由于0.1轉換成二進制時是無限循環的,所以在計算機中0.1只能存儲成一個近似值。另外說一句,除了那些能表示成 x/2^n 的數可以被精確表示以外,其余小數都是以近似值得方式存在的。

  在0.1 + 0.2這個式子中,0.1和0.2都是近似表示的,在他們相加的時候,兩個近似值進行了計算,導致最后得到的值是0.30000000000000004,此時對于JS來說,其不夠近似于0.3,于是就出現了0.1 + 0.2 != 0.3 這個現象。 當然,也并非所有的近似值相加都得不到正確的結果。

  有時兩個近似值進行計算的時候,得到的值是在JS的近似范圍內的,于是就可以得到正確答案。至于哪些值計算后能得到正確結果,哪些不能,我們也不需要去記。

  最好的方法就是我們想辦法規避掉這類小數計算時的精度問題就好了,那么最常用的方法就是將浮點數轉化成整數計算。因為整數都是可以精確表示的。

  方法也很簡單,舉個例子:

  

為什么JS中0.1+0.2 != 0.3?


  按照這個思路,寫個簡單的方法就好了。

http://shenzhen.offcn.com/


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓦房店市| 阳山县| 鲜城| 蒙阴县| 康平县| 兴城市| 江陵县| 昌乐县| 浙江省| 六盘水市| 乌拉特前旗| 滨州市| 屏东市| 双柏县| 中西区| 南宫市| 马山县| 时尚| 吐鲁番市| 响水县| 丘北县| 建宁县| 乌拉特后旗| 水富县| 桂东县| 龙胜| 奇台县| 定襄县| 台安县| 太湖县| 古交市| 太仆寺旗| 阳泉市| 桓仁| 孟连| 彰武县| 辰溪县| 香河县| 澎湖县| 厦门市| 双柏县|