Number.EPSILONES6 在Number對象上面,新增一個極小的常量Number.EPSILON脯燃。根據(jù)規(guī)格汤求,它表示 1 與大于 1 的最小浮點數(shù)之間的差。
對于 64 位浮點數(shù)來說仇轻,大于 1 的最小浮點數(shù)相當(dāng)于二進制的1.00..001,小數(shù)點后面有連續(xù) 51 個零奶甘。這個值減去 1 之后篷店,就等于 2 的 -52 次方。
Number.EPSILON === Math.pow(2,-52) //true
Number.EPSILON?// 2.220446049250313e-16
Number.EPSILON.toFixed(20)// "0.00000000000000022204"
toFixed()? ?//四舍五入
Number.EPSILON實際上是 JavaScript 能夠表示的最小精度臭家。誤差如果小于這個值疲陕,就可以認為已經(jīng)沒有意義了,即不存在誤差了钉赁。
引入一個這么小的量的目的蹄殃,在于為浮點數(shù)計算,設(shè)置一個誤差范圍你踩。我們知道浮點數(shù)計算是不精確的诅岩。
0.1+0.2// 0.300000000000000040
.1+0.2-0.3// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)// '0.00000000000000005551'
所以可以利用Number.EPSILON部署一個誤差檢查函數(shù)
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