常用的进制
-
2进制:0 1
-
8进制:0~7
-
10进制:0~9 (我们平时写代码,写出来的值都是10进制的)
-
16进制:0~9 A-F
-
....
如果我们写的值是以“0x”开头的,浏览器认为其是16进制,默认帮我们转换为10进制进行处理;如果写的值是以“0”开始的,浏览器认为其是8进制,也帮助我们默认转换为10进制,剩余写的值,都是按照10进制算的,但是不论咋样,计算机最后都是按照2进制进行存储。
JS使用number类型表示数字(整数和浮点数),遵循 IEEE-754 标准 通过64位二进制值来表示一个数字
https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html
第0位:符号位,0表示正数,1表示负数 S
第1位到第11位「11位指数」:储存指数部分 E
第12位到第63位「52位尾数」:储存小数部分(即有效数字)F
注:尾数部分在规约形式下第一位默认为1(省略不写)
十进制decimal 转 二进制binary
整数转二进制
用十进制的值一直除以2,直到商为0结束,把每一次取到的余数,从末尾到开始串起来即可。
[number].toString([radix]); 把一个十进制数字转换为[radix]进制的字符串,如果不写[radix],默认是10进制
浮点数转二进制
用十进制浮点数乘以2,每一次取整数部分,把剩下的小数部分继续乘以2...直到乘积是1,没有小数为止。
很多时候会出现无限循环,但是计算机存储二进制最长64位,超出的部分会自动去掉。换句话说,就是计算机底层储存的浮点数的二进制值不一定准确,有可能是省略后的结果。
有一个特例如下:
console.log(0.1 + 0.2 == 0.3);//false
console.log(0.1+0.2);
//0.30000000000000004 != 0.3 因此fasle
console.log(0.1 + 0.3 == 0.4);//true
浏览器最多能储存16位十进制
上面例子的解决方法:浮点数转化为整数,即两个浮点数都乘以一个相同的系数,然后再除以这个系数
console.log(((0.1*10) + (0.2*10))/10);
不同的进制转十进制
-
二进制(0 1)转十进制
- 如:111011
1*2^5+1*2^4+1*2^3+0*2^2+1*2^1+1*2^0
- 如:111011
-
八进制(0~7)转十进制
- 如:072
0*8^2+7*8^1+2*8^0=58
- 如:072
-
十六进制(0
9 AF)转十进制- AF:1015
- 16进制数,一般会以’0x‘开头,如:0x16
1*16^1+6*16^2=220x只是一个标识 - 其他进制如3进制、4进制等转10进制计算方法与上述相同。