如何将表示二进制小数的字符串转换为Python中的数字

时间:2012-12-01 19:31:12

标签: python binary fractions

让我们假设我们有一个表示二进制分数的字符串,例如:

".1"

作为十进制数,这是0.5。 Python中是否有标准的方法可以将这些字符串转换为数字类型(无论是二进制还是十进制都不是非常重要)。

对于整数,解决方案很简单:

int("101", 2)
>>>5

int()接受一个可选的第二个参数来提供基数,但是float()没有。

我正在寻找功能相同(我认为)的东西:

def frac_bin_str_to_float(num):
    """Assuming num to be a string representing
    the fractional part of a binary number with
    no integer part, return num as a float."""
    result = 0
    ex = 2.0
    for c in num:
        if c == '1':
            result += 1/ex 
        ex *= 2
    return result

认为做了我想做的事,虽然我可能错过了一些边缘案例。

在Python中是否有内置或标准的方法?

4 个答案:

答案 0 :(得分:7)

以下是表达相同算法的较短方式:

def parse_bin(s):
    return int(s[1:], 2) / 2.**(len(s) - 1)

它假定字符串以点开头。如果你想要更通用的东西,下面将处理整数和小数部分:

def parse_bin(s):
    t = s.split('.')
    return int(t[0], 2) + int(t[1], 2) / 2.**len(t[1])

例如:

In [56]: parse_bin('10.11')
Out[56]: 2.75

答案 1 :(得分:2)

如下所示,抑制该点而不是分裂是合理的。这个bin2float函数(与上一个答案中的parse_bin不同)正确处理没有点的输入(除了在这种情况下返回整数而不是浮点数)。

例如,调用bin2float('101101'),bin2float('。11101'), and bin2float('101101.11101')分别返回45,0.90625,45.90625。

def bin2float (b):
    s, f = b.find('.')+1, int(b.replace('.',''), 2)
    return f/2.**(len(b)-s) if s else f

答案 2 :(得分:1)

如果您将硬编码的 '2' 替换为该基数,您实际上可以概括 James 的代码以将其从任何数字系统转换。

def str2float(s, base=10):
    dot, f = s.find('.') + 1, int(s.replace('.', ''), base)
    return f / float(base)**(len(s) - dot) if dot else f

答案 3 :(得分:0)

您可以使用 https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jdk_aarch64_linux_hotspot_16.0.1_9.tar.gz 包。使用此包,您可以将二进制分数字符串转换为浮点数,反之亦然。

示例:

>>> from binary_fractions import Binary
>>> float(Binary("0.1"))
0.5
>>> str(Binary(0.5))
'0b0.1'

它有更多的辅助函数来操作二进制字符串,例如:shift、add、fill、to_exponential、invert...

PS:无耻的插件,我是这个包的作者。