Skip to content

Commit 5fca18c

Browse files
authored
Update number.md
1 parent a79f879 commit 5fca18c

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

docs/number.md

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -142,30 +142,36 @@ Number.isInteger("15") // false
142142
Number.isInteger(true) // false
143143
```
144144

145-
注意,由于 JavaScript 浮点数采用的是 IEEE 754 标准,表示数值时最多只能存储 52 位二进制位数(整数和小数的二进制总位数)。超出位数上限时,第 53 位会尝试是否往第 52 位进位(0 不进位,1 进位),它和它往后的位数一概丢弃,这种情况下可能会导致误判。
145+
注意,由于 JavaScript 浮点数采用的是 IEEE 754 标准,表示数值时最多只能存储 53 位二进制位数(1 位隐藏位与 52 位有效位)。超出位数上限时,第 54 位会尝试是否往第 53 位进位(0 不进位,1 进位),它和它往后的位数一概丢弃,这种情况下可能会导致误判。
146146

147147
```javascript
148148
3 === 3 + 2e-16 // true
149149
Number.isInteger(3.0000000000000002) // true
150-
// 3 的二进制 2 位,2e-16 的二进制最多能表示 50 位,第 3 位至 52 位全为 0,直到第 54 位才开始出现 1,而这一位被丢弃了,误判为 true
150+
// 3 的二进制 2 位,2e-16 的二进制最多能表示 51 位,第 3 ~ 53 位全为 0,直到第 55 位才开始出现 1,而这一位被丢弃了,误判为 true
151151

152152
3 + 4e-16 === 3 + 6e-16 // true
153153
Number.isInteger(3.0000000000000004) // false
154154
Number.isInteger(3.0000000000000006) // false
155-
//50 位已为 1,且不会丢精度,所以 JavaScript 判定此数包含小数,返回 false
155+
//51 位已为 1,且不会丢精度,所以 JavaScript 判定此数包含小数,返回 false
156156
```
157157

158-
数值的整数部分为 0 时,其绝对值大于`Number.MIN_VALUE`就视为非整数。
158+
数值的大小在 -1 与 1 之间(不含两个端点)时,其绝对值小于`Number.MIN_VALUE`即视为 0。
159+
160+
```javascript
161+
Number.MIN_VALUE // 5e-324
162+
5e-325 === 0 // true
163+
Number.isInteger(Number.MIN_VALUE) // false
164+
Number.isInteger(5e-325) // true
165+
166+
3e-324 === Number.MIN_VALUE // true
167+
Number.isInteger(3e-324) // false
168+
// 同样由于精度问题,即使是比`Number.MIN_VALUE`略小的数也会被判为 5e-324。
169+
```
170+
171+
因此,在金融、天文等领域的数据精度要求较高、判断值是否整数的情况下,不建议使用`Number.isInteger()`原生函数,请使用以下包含正则的函数惊醒处理:
159172

160173
```javascript
161-
3 === 3 + 2e-16 // true
162-
Number.isInteger(3.0000000000000002) // true
163-
// 3 的二进制 2 位,2e-16 的二进制最多能表示 50 位,第 3 位至 52 位全为 0,直到第 54 位才开始出现 1,而这一位被丢弃了,误判为 true
164174

165-
3 + 4e-16 === 3 + 6e-16 // true
166-
Number.isInteger(3.0000000000000004) // false
167-
Number.isInteger(3.0000000000000006) // false
168-
// 第 50 位已为 1,且不会丢精度,所以 JavaScript 判定此数包含小数,返回 false
169175
```
170176

171177
ES5 可以通过下面的代码,部署`Number.isInteger()`

0 commit comments

Comments
 (0)