Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript二进制和十进制互转 #2

Open
guilixie opened this issue Feb 20, 2021 · 0 comments
Open

JavaScript二进制和十进制互转 #2

guilixie opened this issue Feb 20, 2021 · 0 comments
Labels
JavaScript JavaScript

Comments

@guilixie
Copy link
Owner

关于进制的转换,明明已经学会了,为啥有时候遇到一脸懵逼哦?比如遇到十进制的小数转换为二进制,是不是有点不知所措。

十进制转二进制

如果拿到一个数字52.52,那么Javascript中是如何转成二进制的呢?

  1. 整数部分

主要方法:除二取余,逆序排列。
例如:52转成二进制,转换过程如下:

整数十进制转二进制.png

那么52转成二进制结果就是 110100。

  1. 小数部分

主要方法:乘二取整,顺序排列。
例如:0.52转成二进制,转换过程如下:

小数十进制转二进制.png

在64位系统chrome中显示结果是 0.100001010001111010111000010100011110101110000101001,显然这个数是无限制循环的,而计算机是用二进制存储数字的,是采用国际标准IEEE 754的,位数有限所以就截断了,导致精度失准。具体移步另外一篇文章:JavaScript小数和大整数的精度问题

二进制转十进制

  1. 整数部分

二进制整数转为十进制是从右到左分别乘上2的相应次平方,然后相加的和就是对应十进制的整数。如果首位是0,则表示正整数,首位是1则代表是个负数。正整数可以直接用上面规则换算,负整数则符号位取反,真值位需要减1取反码,然后计算对应的十进制数,然后合起来就是负数对应的十进制数。

例如:110100,转换的过程如下:

1     1     0     1     0     0

2^5   2^4   2^3   2^2   2^1   2^0

1*2^5+1*2^4+0*2^3+1*2^2+0*2^1+0*2^0 = 52

如果二进制负整数是 11101011,那么符号位取反 01101011,然后真值位减1取反 00010101,然后计算出对应十进制数 21,那么原来对应的十进制负整数是 -21。

  1. 小数部分

小数点后面的按照从左到右分别乘以2的相应负数次平方,然后相加的和就是对应十进制的小数部分。

例如:0.110100,转换的过程如下:

0. 1     1     0     1     0     0

  2^5   2^4   2^3   2^2   2^1   2^0

  1*2^(-1)+1*2^(-2)+0*2^(-3)+1*2^(-4)+0*2^(-5)+0*2^(-6) = 0.8125

所以如果是小数的话,那就是整数部分和小数部分,分别按照对应的规则计算,相加就是要得结果。

参考文档

  1. 二进制和十进制之间的相互转换
@guilixie guilixie added the JavaScript JavaScript label Feb 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JavaScript
Projects
None yet
Development

No branches or pull requests

1 participant