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前端的,或是轉行,或是大學生,還有工作中想提升自己能力的,正在學習的小夥伴歡迎加入
點擊:加入
JavaScript的BUG?浮點運算:0.1 + 0.2 != 0.3