当我尝试将十进制数转换为二进制时,为什么我的代码产生错误的输出?

时间:2019-06-05 17:58:01

标签: python python-3.x

我正在尝试将十进制数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)

2 个答案:

答案 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

我还建议您不要将二进制表示形式转换为十进制格式。只需将数字累积为字符串即可。