在javascript中,数字在内部表示为双精度浮点数,表示有53位可用于表示整数值。有一个Number.MAX_SAFE_INTEGER
常量说明了这一点,它等于Math.pow(2, 53) - 1
。但是,在JavaScript控制台中,我可以输入Number.MAX_SAFE_INTEGER + 20
,它将吐出正确的整数值。
javascript如何在内部表示大于Number.MAX_SAFE_INTEGER
的数字?
答案 0 :(得分:1)
基本浮点数表示为:
digits * 2 ** movement
digits
具有52位,movement
具有11位,并且两者共同构成一个64位数字(带有1个符号位)。现在,仅用movement
为0
来表示整数,然后digits
包含52位数字,并且最多可以容纳2 ** 53 - 1
个数字。现在,对于更大的数字,您必须使用movement
,这基本上意味着您向左或向右移动digits
,因此会失去准确性。
想象数字只需要8位
number > digits | movement > result
// savely represented
11111111 > 111111111 | 0 > 11111111
// lost the last 1
111111111 > 111111111 | 1 > 111111110
// lost the two last 1s
1111111111 > 11111111 | 10 > 1111111100