我正在尝试将十进制数434789
转换为其二进制形式1101010001001100101
,但是输出错误的1101010001001100032.0
。我怎样才能解决这个问题?
这是我的代码:
def n_to_b_converter():
new_n = float(0)
p = 10
n = float(input("Enter the number in base 10: "))
b = float(input("Enter the base to convert to: "))
r = n % b
q = (n - r) / b
new_n += r
n = q
while q != 0:
r = n % b
q = (n - r) / b
new_n += r * p
p *= 10
n = q
return "{0:.1f}".format(new_n)
答案 0 :(得分:1)
当前,您正在增加数字的小数表示形式,直到看起来与数字的二进制表示形式相同为止。例如,对于67
,您将产生数字1,000,011
(为清楚起见插入了逗号)。 不是 是转换为二进制文件的一种好方法,主要是因为它具有误导性,其次是因为当数字变得很高时,会导致浮点数错误(这是导致错误的根源)。问题所在:代替'{0:.1f}'.format(new_n)
,而要做str(new_n)
-在较新版本的python int中可以任意增大,而不会损失精度,没有理由将其设为浮点数。>
但是您真正应该要做的是使用字符串代替。实际上,python标准库提供了一种现成的bin()
方法,可以将整数转换为二进制表示的字符串:
s = bin(67)
# s = '0b1000011'
您可以通过切片将数字取一部分:
s = bin(67)[2:]
# s = '1000011'
,然后,如果您真的希望将其作为那么大的十进制数字,则可以将其强制转换回int。
t = int(s)
# t = 1,000,011
答案 1 :(得分:1)
您正在尝试对浮点数执行离散(整数)处理。四舍五入的错误使您丧命。更改为整数运算:
new_num = 0
p = 10
num = 434789
base = 2
rem = num % base
quot = (num - rem) // base
new_num += rem
num = quot
while quot != 0:
rem = num % base
quot = (num - rem) // base
new_num += rem * p
print(num, '\t', new_num,'\t', rem,'\t', quot,'\t', p)
p *= 10
num = quot
print(new_num)
输出:
217394 1 0 108697 10
108697 101 1 54348 100
54348 101 0 27174 1000
27174 101 0 13587 10000
13587 100101 1 6793 100000
6793 1100101 1 3396 1000000
3396 1100101 0 1698 10000000
1698 1100101 0 849 100000000
849 1001100101 1 424 1000000000
424 1001100101 0 212 10000000000
212 1001100101 0 106 100000000000
106 1001100101 0 53 1000000000000
53 10001001100101 1 26 10000000000000
26 10001001100101 0 13 100000000000000
13 1010001001100101 1 6 1000000000000000
6 1010001001100101 0 3 10000000000000000
3 101010001001100101 1 1 100000000000000000
1 1101010001001100101 1 0 1000000000000000000
1101010001001100101
我还建议您不要将二进制表示形式转换为十进制格式。只需将数字累积为字符串即可。