我需要编写一个Python脚本,它将基数为10的数字转换成二进制数,小数点后最多为n个值。我不能只使用bin(x)!这就是我所拥有的:
def decimal_to_binary(x, n):
x = float(x)
test_str = str(x)
dec_at = test_str.find('.')
#This section will work with numbers in front of the decimal
p=0
binary_equivalent = [0]
c=0
for m in range(0,100):
if 2**m <= int(test_str[0:dec_at]):
c += 1
else:
break
for i in range(c, -1, -1):
if 2**i + p <= (int(test_str[0:dec_at])):
binary_equivalent.append(1)
p = p + 2**i
else:
binary_equivalent.append(0)
binary_equivalent.append('.')
#This section will work with numbers after the decimal
q=0
for j in range(-1, -n-1, -1):
if 2**j + q <= (int(test_str[dec_at+1:])):
binary_equivalent.append(1)
q = q + 2**j
else:
binary_equivalent.append(0)
print float((''.join(map(str, binary_equivalent))))
所以说你通过decimal_to_binary(123.456,4)调用函数它应该将123.456转换为二进制,小数点后4位,产生1111011.0111。
第一部分没问题 - 它将取小数前面的数字,在本例中为123,并将其转换为二进制,输出1111011
然而,处理小数点后的值的第二部分没有按我认为的那样做。它给出的输出不是.0111,而是.1111
我用笔和纸写下了每个变量的值,它应该有效。但事实并非如此。任何人都可以帮我解决这个问题吗?
我将该函数称为decimal_to_binary(123.456,4)并打印出1111011.1111
答案 0 :(得分:0)
您已关闭,但超出小数时,您的比较存在问题:
if 2**j + q <= (int(test_str[dec_at+1:])):
您在此处所做的是将小数值(因为j
始终为负)与整数值进行比较。出于所有实际目的,这种比较总是正确的。
根据周围的逻辑,我的猜测是你试图将它与实际的十进制值进行比较。使用您的数据,在第一次迭代时将是0.4
,因此您希望将语句评估为:
0.5 <= 0.4
代码中的实际比较是:
0.5 <= 4
这里有两个不同的问题:
test_str[dec_at:]
而非test_str[dec_at+1:]
int
。即使您在第一点应用了更改,您的代码仍然无法正常运行。但是,在这种情况下,这将是因为强制转换会在每次迭代时将值截断为0。转而投放到浮动:float(test_str[dec_at:])
您的比较线因此变为if 2**j + q <= (float(test_str[dec_at:])):
,它在我的机器上提供正确的输出。
请注意,浮点比较可以是&#34;挑剔的&#34;在某些情况下,取决于四舍五入等。如果需要,可以ways to mitigate this。