数字存储
在对精度要求很高的系统中,或要对小数的运算结果进行比较时,需要特别谨慎
问题
- JS中的小数运算是精确的嘛?
不一定
- JS中的整数运算是精确的嘛?
不一定
- JS中表示的整数时连续的嘛?
ON
- JS中表示的最大数字是多少?
最大连续整数 : 1~能掰手指头 window.Number.MAX_SAFE_INTEGER
- JS中能表示的数字有效位数是多少?
16 ~ 17 位
二进制
现实世界中: 十进制,10个数字,缝十进一
计算机世界中:二进制,2个数字,缝二进一
二进制 --> 十进制
1101 --> 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 = 13 1*2^3 + 1 * 2^2 + 0*2^1 + 1*2^0 = 13 1∗23+1∗22+0∗21+1∗20=13
11.01 --> 1 ∗ 2 1 + 1 ∗ 2 0 + 0 ∗ 2 − 1 + 1 ∗ 2 − 2 = 3.25 1*2^1 + 1*2^0 + 0*2^{-1} + 1*2^{-2} = 3.25 1∗21+1∗20+0∗2−1+1∗2−2=3.25
十进制转二进制
13 -->
13 / 2 商 6 余 1
6 / 2 商 3 余 0
3 / 2 商 1 余 1
1 / 2 商 0 余 1
余数从下往上看
3.25 -->11
整数部分一样
小数部分
0.25 * 2 0.5 整数部分 : 0
0.5 * 2 1.0 整数部分 : 1
整数部分从上往下看
为什么JS的小数运算不精确
十进制的小数,转换位二进制后,可能是无限小数,但是计算机对数字存储能力有限,因此会丢失一些数据
- 十进制数 0.3 --> 0。01001100110011001100………………
结果所以JS小数位运算不精确论证成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWbxmV2m-1588189900825)(result.png)]
0.3*2 0.6 整数部分 : 0
0.6*2 1.2 整数部分 : 1
0.2*2 0.4 整数部分 : 0
0.4*2 0.8 整数部分 : 0
0.8*2 1.6 整数部分 : 1
0.6*2 1.2 整数部分 : 1
0.2*2 0.4 整数部分 : 0
…………
整数部分从上往下看
JS如何存储数字
一般形式 : 整数法,浮点法
JS中,存储的所有数字,都按照浮点法存放
浮点法存放的数字,叫做浮点数(float),浮点数分位单精度和双精度
JS中,使用双精度存放浮点数,IEEE 754,
存放方式
JS在计算机中。给每个数字开辟一快空间,尺寸固定为64位
在计算机中,位(bit)是最小的存储单位,简称位bit,
1 byte = 8 bit
1 KB = 1024 byte
1 GB = 102 4MB
[第一段][第二段][第三段]
第一段 : 1位,表示位号位,如果为1,是负数,如果为0,是正数
第二段 : 11位,表示指数位,这里的指数是值2位底的指数而不是10
第三段 : 52位,表示有效数字,
举例
0 0000 0000 011 1111 0000 0000 0000……
11位的二进制可以表示多个数字
1位 2 2^1
2位 4 2^2
3位 8 2^3
…………
11位 2048 2^11
相当于 : 1.1111000000 … … ∗ 2 1027 − 1023 1.1111000000…… * 2^{1027 - 1023} 1.1111000000……∗21027−1023
特殊情况
-
指数为0,尾数为0 表示数字 0
-
指数为2047 ,尾数为0,表示为Infinity
Infinity : 0 1111111111 0000000000……………………=Infinity
- 符号为1,指数为2047,尾数为0,表示负无穷
-Infinity : 0 1111111111 0000000000……………………=-Infinity
- 指数为2047,尾数不为0,表示NaN
NaN : 1 11111111111 010001010000…………
一个正常的数字,指数部分最多是2046
- 检验结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yWoNRnm-1588189900830)(Infinity.png)]
能表示的最大数字
0 111111111111110 111111111111…………
相当于: 1.11111111111 ∗ 2 1 023 1.11111111111* 2 ^1023 1.11111111111∗21023
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVEbBAQG-1588189900832)(NumberMax.png)]
能表示最大的安全数字
安全数字:从1开始到该数字,均是连续的整数,并且该数字的下一个整数是存在的.
0 xxxxx 11111111111……
相当于 : $ 1111111111…… * 2 ^ {52} $
1111……(53个1) 2^53-1
99 10*2-1
999 10*3-1
下一位是 :
2
5
3
2^53
253 00000000000000