Open shfshanyue opened 3 years ago
自2003年以后,电脑普遍采用x86-64架构,而架构的数据单元的固定为64位(8字节)
64位双精度浮点数(double-precision 64-bit floating point format)
其中双精度浮点数是用来表示带有小数部分的实数
双精度浮点数最多有15或16位十进制有效数字,即53位二进制有效数字
IEEE-754规定
64位二进制存储单元由3部分组成 1+11+52 1是表示正负数 11是表示指数位置 52则是数据值位置
所以因为单位存储空间限制,安全整数的范围是1位正数加52位数据位 即53位二进制,超过只能溢出到指数位置存储,无法安全表示,所以安全整数的位数是
Number.MAX_SAFE_INTEGER.toString(2).length;
根据 MDN 的文档描述:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger
Number.MAX_SAFE_INTEGER
是最大安全整数,Number.isSafeInteger()
用来判断一个数值是否为安全整数。而在安全整数之外,加减计算则会发生精度问题,如下:
而安全整数的问题,与
0.1+0.2
的问题类似。在 Javascript 中,整数被存储为双精度浮点数,而在整数大到一定程度后,就会导致精读失真。如下,最大安全整数可以精准表示。以下截图使用 https://devtool.tech/double-type 进行实时转换整数的 IEEE754 表示。
但是最大安全整数加2,尾数位会溢出,导致该数值无法精准表示。