關於JavaScript中浮點數比較的問題
阿新 • • 發佈:2019-02-16
我們在javascript中操作浮點數加減運算判斷時經常會遇到這樣的問題,比如
0.1+0.2 == 0.3
false
按照我們正常的思維 應該是相等啊,怎麼返回的是 false 呢?
這個是因為javascript的進度問題,我們看一下
0.1+0.2
0.30000000000000004
0.1 + 0.2 - 0.3
5.551115123125783e-17
如何解決此問題,在新的ES6中引入了一個 極小的常量 Number.EPSILON,它表示1與大於1的最小浮點數之間的差.
對於64位浮點數來說,大於1的最小浮點數相當於二進位制的1.00..001,小數點後面有連續51個零。這個值減去1之後,就等於2的-52次方.
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// “0.00000000000000022204”
所以我們在判斷比較兩個浮點數時,可以通過這個常量來進行判斷比較,定義一個最小的進度範圍,誤差如果小於這個值,就可以認為已經沒有意義了,即不存在誤差了。比如,誤差範圍設為2的-50次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數的差小於這個值,我們就認為這兩個浮點數相等。
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}
0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true
1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true
上面的程式碼為浮點數運算,部署了一個誤差檢查函式