您的位置:首页 > 其它

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

2017-01-13 19:37 330 查看
十进制分数转换为二进制数

使用短除法。

例如将十进制分数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-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制