JavaScript的BUG?浮點運算:0.1 + 0.2 != 0.3

浮點運算的問題

在JavaScript中進行純小數運算偶爾會得到不正確的結果:

> 0.1 + 0.2 == 0.3
false

> 0.1 + 0.2
0.30000000000000004

很多人馬上就開始認爲JavaScript設計的不成熟,設計上有缺陷。

實際上這並不是JavaScript僅有的問題,C/C++/Java甚至Matlab都有這個問題。

 這只是JavaScript遵循IEEE 754標準所產生的必然結果。IEEE 754標準中的浮點數並不能精確地表達小數(比如說0.1),

  • 你需要足夠的內存來保留5個數字
  • 你需要使用一個取值範圍來確保精度。

在硬件層面,除法是轉換成乖法來表示的,比如: Z = X/Y 會變成 Z = X * (1/Y);

JavaScript中的小數採用的是雙精度(64位)表示的,由三部分組成: 符 + 階碼 + 尾數,在十進制中的 1/10,在十進制中可以簡單寫爲 0.1 ,但在二進制中,他得寫成:0.0001100110011001100110011001100110011001100110011001…..(後面全是 1001 循環)。因爲浮點數只有52位有效數字,從第53位開始,就舍入了。這樣就造成了“浮點數精度損失”問題。

所以你在處理小數運算時要非常小心。

怎麼解決

就像標準中提到的,我們可以採用一個精確範圍來比較是否相等

x = 0.2;
y = 0.3;
equal = (Math.abs(x - y) < 0.000001)

第二種方法是使用JavaScript內置的函數toPrecision或toFixed來保留一定的精度:

(0.1 + 0.2).toPrecision(10) == 0.3
> true

(0.1 + 0.2).toFixed(10) == 0.3
> true

如果你依然在編程的世界裏迷茫,不知道自己的未來規劃,可以加入web前端學習交流羣:731771211 裏面可以與大神一起交流並走出迷茫。新手可進羣免費領取學習資料,看看前輩們是如何在編程的世界裏傲然前行!羣裏不停更新最新的教程和學習方法(進羣送web前端系統學習路線,詳細的前端項目實戰教學視頻),有想學習web前端的,或是轉行,或是大學生,還有工作中想提升自己能力的,正在學習的小夥伴歡迎加入

點擊:加入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章