JS使用64位的浮点数存储数字,浮点数分为符号、指数、尾数三个部分

例如-114,转换成二进制数就是-1110010,再转换成科学计数法就是-1.110010 * 10^110^,其中,-是符号、110是指数、110010是尾数

尾数决定了数字的精度,最多能存52位精度,不足向前补0、超过向后截断

为了最大限度利用这52位,通常会省略小数点前的那个1,也就是最多可以代表53位的数

也就是说,能被完整存储的最大数字为2^53^-1,即9007199254740991,也就是Number.MAX_SAFE_INTEGER,最大安全整数

如果数字超过了最大安全整数,那么它的精度就可能丢失,可能出现难以预料的问题

1
2
// 正常结果将会是100......0和100......1,但是唯一不同的最后一位被截断了,剩下就相同了
console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2) // ->true