【问题标题】:Python code to convert decimal to binaryPython代码将十进制转换为二进制
【发布时间】:2017-02-04 11:17:58
【问题描述】:

我需要编写一个 Python 脚本,它将以 10 为底的 x 转换为二进制,小数点后最多 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

【问题讨论】:

    标签: python-2.7 binary


    【解决方案1】:

    你已经接近了,但是当你超过小数点时,你的比较有问题:

    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. 您正在投射到int。即使您在第一点应用了更改,您的代码仍然无法正确运行。但是,在这种情况下,这是因为强制转换会在每次迭代时将值截断为 0。改为浮动:float(test_str[dec_at:])

    因此,您的比较行变为if 2**j + q &lt;= (float(test_str[dec_at:])):,它在我的机器上提供了正确的输出。

    请注意,浮点比较在某些情况下可能是“挑剔的”,具体取决于舍入等。如果需要,有ways to mitigate this

    【讨论】:

    • 哦,天哪。这是一个如此简单的错误......非常感谢!
    猜你喜欢
    • 2016-08-13
    • 2020-08-06
    • 2013-09-28
    • 2020-04-03
    • 2014-02-13
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多