如果我们写的值是以“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(省略不写)
用十进制的值一直除以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);
- 如:111011 `1*2^5+1*2^4+1*2^3+0*2^2+1*2^1+1*2^0`
- 如:072 `0*8^2+7*8^1+2*8^0=58`
- AF:1015
- 16进制数,一般会以’0x‘开头,如:0x16 `1*16^1+6*16^2=22` 0x只是一个标识
- 其他进制如3进制、4进制等转10进制计算方法与上述相同。
我正在参与[2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!](https://cloud.tencent.com/developer/article/2352251)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。