Skip to content

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

@guilixie

Description

@guilixie

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

十进制转二进制

如果拿到一个数字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. 二进制和十进制之间的相互转换

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions