十进制小数分数与二进制的转换

2022-11-08 19:18:45 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

十进制分数转换为二进制数 使用短除法。

例如将十进制分数11/28转换为二进制数,过程如下: 1、首先将分子分母分别转换成二进制 (11)10=(1011)2 (28)10=(11100)2

2、使用短除,借位时是借2,商只能是0或1

所以:11/28=1011/11100=0.01100100…

十进制小数转换为二进制小数

十进制数的整数位是二进制数的整数位,十进制数的小数位是二进制数的小数位。两部分分开转换。

整数部分 除以2取余,逆序排列。 小数部分 乘 2 取整,顺序排列。

例如转换十进制小数11.4,过程如下。

计算整数部分,11转换为二进制位1011:

计算小数部分0.4,首先将小数部分一直乘2,积的整数部分顺序取出: 0.4*2=0.8 取0 | 0.8*2=1.6 取1 | 顺 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 |

可以看出0110是循环,因此小数部分的二进制是 0.01100110……(循环0110)

最终结果是整数位和小数位合并1101111.01100110……(2)

二进制小数转换为十进制小数 使用按权展开求和法,小数点左边是2的正数次方,从0开始;小数点右边是2的负数次方,从-1开始。

例如将101.111(2)转换成十进制数

1*(2^2) 0*(2^1) 1*(2^0) # 整数部分

1*(2^(-1)) 1*(2^(-2)) 1*(2^(-3)) # 小数部分

=5.875

附 python 版十进制与二进制转换

代码语言:javascript复制
# coding=UTF-8
from decimal import Decimal


def dec2bin(n, bit=20):
    """
    n, integer or float to convert
    bit, bits after point
    return binary, string
    """
    negative = False
    if n < 0:
        negative = True
        n *= -1

    integer = int(n)
    decimal = n - integer
    binary = ""

    if n == 0:
        return "0"

    while integer != 0:
        result = int(integer % 2)
        integer /= 2
        binary = str(result)   binary

    if decimal != 0:
        i = 0
        decimal_bin = ""  # binary decimal after convert
        while decimal != 0 and i < bit:
            result = int(decimal * 2)
            decimal = decimal * 2 - result
            decimal_bin  = str(result)
            i  = 1
        binary = binary   '.'   decimal_bin

    if negative:
        binary = '-'   binary

    return binary

def bin2dec(n):
    """
    n binary, support point
    return integer or float
    """
    negative = False
    if n < 0:
        negative = True
        n *= -1

    integer = int(n)
    decimal = n - integer

    if integer != 0:
        integer_str = str(integer)
        length = len(integer_str)

        integer = 0
        for i in xrange(0, length):
            bit = int(integer_str[i])
            if bit == 1:
                integer  = 2 ** (length - i - 1)
            elif bit != 0:
                print "invalid integer:"   str(n)

    if decimal != 0:
        decimal_str = str(decimal)[2:] # skip "0."
        length = len(decimal_str)

        decimal = 0
        for i in xrange(0, length):
            bit = int(decimal_str[i])
            if bit == 1:
                decimal  = 2 ** (-1 * (i   1))
            elif bit != 0:
                print "invalid decimal:"   str(n)

    result = integer   decimal

    if negative:
        result *= -1

    return result


def testcases():
    for pair in [(125, '1111101'),
                 (1.3, '1.01001100110011001100'),
                 (2.5, '10.1'),
                 (0, '0'),
                 (-1, '-1'),
                 (0.5, '.1')]:
        assert pair[1] == dec2bin(pair[0])

    for pair in [(-1001.1100, -9.75),
                 (-1101, -13),
                 (111.111, 7.875),
                 (0.1101, 0.8125),
                 (1001, 9),
                 (0, 0),
                 (0.1, 0.5)]:
        assert pair[1] == bin2dec(pair[0])

    print "all test case success"


if __name__ == "__main__":
    # testcases()
    print bin2dec(0.5)

参考:

http://blog.csdn.net/caoguo_app_android/article/details/9955743

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

0 人点赞