Python代码将十进制转换为二进制

时间:2016-09-27 00:18:43

标签: python-2.7 binary

我需要编写一个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

1 个答案:

答案 0 :(得分:0)

您已关闭,但超出小数时,您的比较存在问题:

if 2**j + q <= (int(test_str[dec_at+1:])):

您在此处所做的是将小数值(因为j始终为负)与整数值进行比较。出于所有实际目的,这种比较总是正确的。

根据周围的逻辑,我的猜测是你试图将它与实际的十进制值进行比较。使用您的数据,在第一次迭代时将是0.4,因此您希望将语句评估为:

0.5 <= 0.4

代码中的实际比较是:

0.5 <= 4

这里有两个不同的问题:

  1. 您获取小数点后的所有数字,但实际上并未在提取中包含小数点本身。这主要是为什么你的测试中的整数不正确。只需引用test_str[dec_at:]而非test_str[dec_at+1:]
  2. 即可解决此问题
  3. 您正在转向int。即使您在第一点应用了更改,您的代码仍然无法正常运行。但是,在这种情况下,这将是因为强制转换会在每次迭代时将值截断为0。转而投放到浮动:float(test_str[dec_at:])
  4. 您的比较线因此变为if 2**j + q <= (float(test_str[dec_at:])):,它在我的机器上提供正确的输出。

    请注意,浮点比较可以是&#34;挑剔的&#34;在某些情况下,取决于四舍五入等。如果需要,可以ways to mitigate this