1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-25 03:02:21 +00:00

docs(number): edit Number.EPSILON #508

This commit is contained in:
ruanyf 2017-10-01 06:48:10 +08:00
parent 2585e72712
commit 673440939e

View File

@ -164,15 +164,21 @@ ES5 可以通过下面的代码,部署`Number.isInteger()`。
## Number.EPSILON
ES6在Number对象上面新增一个极小的常量`Number.EPSILON`
ES6 在`Number`对象上面,新增一个极小的常量`Number.EPSILON`。根据规格它表示1与大于1的最小浮点数之间的差。
对于64位浮点数来说大于1的最小浮点数相当于二进制的`1.00..001`小数点后面有连续51个零。这个值减去1之后就等于2的-52次方。
```javascript
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// '0.00000000000000022204'
// "0.00000000000000022204"
```
`Number.EPSILON`实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。
```javascript
@ -186,23 +192,31 @@ Number.EPSILON.toFixed(20)
// '0.00000000000000005551'
```
但是如果这个误差能够小于`Number.EPSILON`,我们就可以认为得到了正确结果
上面代码解释了,为什么比较`0.1 + 0.2``0.3`得到的结果是`false`
```javascript
5.551115123125783e-17 < Number.EPSILON
0.1 + 0.2 === 0.3 // false
```
`Number.EPSILON`可以用来设置“能够接受的误差范围”。比如如果两个浮点数的差小于2的-50次方`Number.EPSILON * Math.pow(2, 2)`,我们就可以认为这两个浮点数是相等的。
```javascript
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2)
// true
```
因此,`Number.EPSILON`的实质是一个可以接受的误差范围。
因此,`Number.EPSILON`的实质是一个可以接受的最小误差范围。
```javascript
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false
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
```
上面的代码为浮点数运算,部署了一个误差检查函数。