CPPAlien / JS-QA

前端知识问答
0 stars 0 forks source link

Number 和 BigInt #39

Open CPPAlien opened 4 years ago

CPPAlien commented 4 years ago

ECMAScript 中有两个数字类型 number 和 bigint. number 是一个双精度浮点类型,相当于其他语言的 int、long、float、double 这些 根据 IEEE 754 规定一个双精度浮点数的规范如下。 1236px-IEEE_754_Double_Floating_Point_Format svg

中间 11 位表示指数,其中最高位表示该指数的正负。所以最大可以表示 (2^10 - 1) = 1023。 由于 全0 和全 1 都为保留字,全0 表示上面说的整数部分为 1

其中后 52 位为小数部分,默认整数部分为 1,如果 Exponent 全为 0 时,则整数部分为 0。 假设这 52 位都为 1,则用二进制表示一个小数位 1.111...,此时如果 Exponent 表示一个 52,则可以表示一个 53 个都为 1 的整数,所以number 最大可表示一个 (2^53 - 1) 范围内才是安全的。这个数也就是:Number.MAX_SAFE_INTEGER。如果再大,由于 52 位数不够用了,那么后面的也就不精确了,只能用指数来表示大致的范围了。

就此我们可以推断出,Number 最大可表示的数 Number.MAX_SAFE_INTEGER * Math.pow(2, 1023 - 52) 也就是 Number.MAX_VALUE,再大就是 Infinity 了,NaN。

1.7976931348623157e+308
000000000002=00016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); and
111111111112=7ff16 is used to represent ∞ (if F = 0) and NaNs (if F ≠ 0)

所以指数范围是 2^-1022 ~ 2^1023。最大可以到是进制的 8.98846567431158e+307。由于2进制表示为 10 进制后数字不是连续的,所以造成会有精度问题。

BigInt 可以表示任意大小的整数