# JavaScript 数字
JavaScript数字全部是浮点数。根据IEEE 754标准中的64位二进制
(binary64), 也称作双精度规范(double precision)来储存。使用64个字节
来存储
1 + 11 + 52
64位bit分为三个部分:
- 符号位S:第 1 位是正负数符号位(sign),0代表正数,1代表负数
- 指数位E:中间的 11 位存储指数(exponent),用来表示次方数
- 尾数位M:最后的 52 位是尾数(mantissa),超出的部分自动进一舍
接下来我们会使用二进制(虽然这并不是通常的浮点数表示方式)。并用一个%
作为前缀来标识
虽然JavaScript数字是以二进制保存的,但输出(打印)时通常是以10进制显示。
0.1 + 0.2 == 0.3 //false
0.1 + 0.2 === 0.3 //false
原因:在于在javascript中,所有的数字都是浮点数并且使用二进制表示,表示一个0.1
,在十进制中没有问题),但是在二进制中表示会带来无限循环。所以必然要引入精度的问题
# 最大范围
ECMAScript规范中也添加了1个Number常量最大安全整数Number.MAX_SAFE_INTEGER
,该值为9007199254740992
(2^53 -1)
注意:
- 这里为
53
而非52
- 最大的位数只有16位,如果超出16位,会出现精度丢失的问题
- js引擎在工作的时候为了效率,可能会使用内存32位而非64位
# 参考
- https://segmentfault.com/q/1010000038232026