数字的存储
在对精度要求很高的系统中,或要对小数的运算结果进行比较时,需要特别谨慎
问题
- js中的小数运算是精确的吗?
不一定
- js中的整数运算是精确的吗?
不一定
- js中表示的整数是连续的吗?
不是,当 js 的数字很大的时候,不再连续
- js中表示的最大数字是多少?
最大连续整数:
从1开始数到这个数字一直都是连续的,并且到下一个数字也是连续的,通过Number.MAX_SAFE_INTEGER在控制台查看
- js中能表示的数字有效位数是多少?
16~17位
二进制
计算机世界中是二进制,因为计算机是由若干电路构成的,通过电平的高低来表示二进制
二进制转换成十进制
- 整数
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···>
//除2取余
13 / 2 商 6 余 1
6 / 2 商 3 余 0
3 / 2 商 1 余 1
1 / 2 商 1 余 1
//余数从下往上看就是该数对应的二进制
--1101
小数···>
3.25
整数部分一样----结果为11
小数部分
//乘2取整
0.25 * 2 = 0.5 整数部分:0
0.5 * 2 = 1 整数部分:1
整数部分从上往下看
11.01
为什么js的小数运算不精确
十进制的小数,转换为二进制后,可能是无限小数,但是计算机对数字的存储能力有限,因此会丢失一些数据;
比如:
十进制-0.3
整数部分:0
小数部分:
运算 整数部分
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
...
//变量名.toString(2),将该变量转换为2进制并展示出来
Js中如何存储数字
整数法、浮点数
JS中,存储的所有数字,都按照浮点法存放。
浮点法存放的数字,叫做浮点数(float),浮点数分为单精度和双精度.
JS中,使用双精度存放浮点数,IEEE 754标准.
存放方式
JS在计算机中,给每个数字开辟一块内存空间,尺寸固定为64位,哪怕存个1,前面63位补0;
在计算机中,位(bit)是最小的存储单位,简称为bit,
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
[第一段][第二段][第三段]
第一段:1位,表示符号位,1负 0正
第二段:11位,表示指数位,这里的指数是指2为底的指数,而不是10
第三段:52位,表示有效数字
举例:
0 1000 0000 011 1111 0000 0000 0000...
相当于: 1.1111 ∗ 2 1027 − 1023 1.1111 * 2 ^ {1027-1023} 1.1111∗21027−1023
特殊情况
-
指数为0,同时尾数为0—表示数字0
-
指数为2047, 尾数为0—表示正无穷
+Infinity: 0 1111 1111 111 0000 0000 0000...
- 符号为1,指数为2047,尾数为0,表示负无穷;
-Infinity: 1 1111 1111 111 0000 0000 0000...
- 指数为2047, 尾数不为0,表示NaN
NaN : 1 11111111111 011000010000...
一个正常的数字,指数部分最多是2046
能表示的最大数字
0 1111 1111 110 1111 1111 1111 1111...
相当于:
1.11111111...
∗
2
1
023
1.11111111... * 2 ^ 1023
1.11111111...∗21023
在console里面用Number.MAX_VALUE查看
最小数字用Number.MIN_VALUE查看
能表示的最大的安全整数
安全数字: 从1开始到该数字,均是连续的整数,并且该数的下一个整数是存在的.
0 xxxxxxxxxxx 11111111...
相当于: 1.11111111... ∗ 2 5 2 1.11111111... * 2 ^ 52 1.11111111...∗252
指数为52可以 去掉小数点,所以算出来结果就是最大安全整数:53个连续的1
咱们先不忙着算二进制的53个连续的1是多少,来看一下十进制里:
十进制里面每一位最大是9,
9 10**1 - 1
99 10**2 - 1
999 10**3 - 1
9999 10**4 - 1
发现规律了没,所以在二进制里面53个连续的1相当于就是2**53 - 1