给定包含小数部分s: 100.0011
输出必须为4.1875
我使用了".".join(map(lambda x:str(int(x,2)),s.split('.')))
这会给4.3
但不会4.1875
答案 0 :(得分:3)
将数字拆分为整数和小数部分,然后使用int
将每个部分设为十进制,请记住小数部分必须根据其长度进行调整:
>>> s = "100.0011"
>>> d = s.split(".")
>>> int(d[0],2) + float(int(d[1],2)) / 2**len(d[1])
4.1875
将0011
除以2的长度(2 4 为16)确保它被正确处理( 3 / 16 是0.1875)。
答案 1 :(得分:2)
您可以使用此代码将其转换为小数。不是最有效的,但有效:
s = "100.0011" # binary number
n = s.index(".") # number of positions before the decimal point
r = 0 # result
for digit in s.replace(".", ""): # iterate through each digit ommiting the point '.'
r += int(digit) * 2 ** (n-1) # multiplicate the digit by the respective power of 2
n -= 1
print r # 4.1875
这是如何工作的?请记住如何将二进制数转换为十进制数(基数为10):
100.0011 -> 1 0 0 . 0 0 1 1
powerOf 2 -> 4 2 1 1/2 1/4 1/8 1/16
| | | | | | |
1*2^2 + 0*2^1 + 0*2^0 + 0*2^(-1) + 0*2^(-2) + 1*2^(-3) + 1*2^(-4)
答案 2 :(得分:-1)
int(x,2)
无法理解如何转换小数的小数部分,因为这些值都是负2的幂而不是正2.您可以执行以下操作:
int_, frac = s.split(".")
res = ((int(int_, 2) << len(frac)) + int(frac, 2)) / (2 ** len(frac))