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

来源:互联网 发布:sql选中一列 编辑:程序博客网 时间:2024/06/08 06:26


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

例如将十进制分数11/28转换为二进制数,过程如下:

1、首先将分子分母分别转换成二进制 
(11)10=(1011)2 
(28)10=(11100)2 

2、使用短除,借位时是借2,商只能是0或1 
            0.0110010 
        ———————— 
 11100 ) 1011.00 
          111 00 
         ————————— 
          100 000 
           11 100 
         ————————— 
          100 000 
           11 100 
         ————————— 
              100 
              ... 
     所以:11/28=1011/11100=0.01100100...



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

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

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

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

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

               余 数
  +                ^
2 |     1 1     1  | 逆
  +-+------+       | 序
  2 |     5     1  | 写
    +-+----+       | 出
    2 |   2     0  |
      +-+--+       |
      2 | 1     1  |
        +--+       +
          0



计算小数部分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 版十进制与二进制转换

# coding=UTF-8from decimal import Decimaldef 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 binarydef 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 resultdef 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 0
原创粉丝点击