mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-25 11:12:21 +00:00
docs(number): edit Number.EPSILON #508
This commit is contained in:
parent
2585e72712
commit
673440939e
@ -164,15 +164,21 @@ ES5 可以通过下面的代码,部署`Number.isInteger()`。
|
|||||||
|
|
||||||
## Number.EPSILON
|
## Number.EPSILON
|
||||||
|
|
||||||
ES6在Number对象上面,新增一个极小的常量`Number.EPSILON`。
|
ES6 在`Number`对象上面,新增一个极小的常量`Number.EPSILON`。根据规格,它表示1与大于1的最小浮点数之间的差。
|
||||||
|
|
||||||
|
对于64位浮点数来说,大于1的最小浮点数相当于二进制的`1.00..001`,小数点后面有连续51个零。这个值减去1之后,就等于2的-52次方。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
Number.EPSILON === Math.pow(2, -52)
|
||||||
|
// true
|
||||||
Number.EPSILON
|
Number.EPSILON
|
||||||
// 2.220446049250313e-16
|
// 2.220446049250313e-16
|
||||||
Number.EPSILON.toFixed(20)
|
Number.EPSILON.toFixed(20)
|
||||||
// '0.00000000000000022204'
|
// "0.00000000000000022204"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`Number.EPSILON`实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。
|
||||||
|
|
||||||
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。
|
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@ -186,28 +192,36 @@ Number.EPSILON.toFixed(20)
|
|||||||
// '0.00000000000000005551'
|
// '0.00000000000000005551'
|
||||||
```
|
```
|
||||||
|
|
||||||
但是如果这个误差能够小于`Number.EPSILON`,我们就可以认为得到了正确结果。
|
上面代码解释了,为什么比较`0.1 + 0.2`与`0.3`得到的结果是`false`。
|
||||||
|
|
||||||
```javascript
|
```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
|
// true
|
||||||
```
|
```
|
||||||
|
|
||||||
因此,`Number.EPSILON`的实质是一个可以接受的误差范围。
|
因此,`Number.EPSILON`的实质是一个可以接受的最小误差范围。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
function withinErrorMargin (left, right) {
|
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
|
0.1 + 0.2 === 0.3 // false
|
||||||
withinErrorMargin(0.2 + 0.2, 0.3)
|
withinErrorMargin(0.1 + 0.2, 0.3) // true
|
||||||
// false
|
|
||||||
|
1.1 + 1.3 === 2.4 // false
|
||||||
|
withinErrorMargin(1.1 + 1.3, 2.4) // true
|
||||||
```
|
```
|
||||||
|
|
||||||
上面的代码为浮点数运算,部署了一个误差检查函数。
|
上面的代码为浮点数运算,部署了一个误差检查函数。
|
||||||
|
|
||||||
## 安全整数和Number.isSafeInteger()
|
## 安全整数和 Number.isSafeInteger()
|
||||||
|
|
||||||
JavaScript能够准确表示的整数范围在`-2^53`到`2^53`之间(不含两个端点),超过这个范围,无法精确表示这个值。
|
JavaScript能够准确表示的整数范围在`-2^53`到`2^53`之间(不含两个端点),超过这个范围,无法精确表示这个值。
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user