8

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

".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

4 回答 4

8

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

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
于 2012-12-01T19:36:52.773 回答
3

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

例如,调用bin2float('101101')bin2float('.11101') , andbin2float('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
于 2012-12-01T20:30:02.297 回答
1

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

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
于 2021-02-03T01:34:44.420 回答
0

You can use the Binary fractions package. With this package you can convert binary-fraction strings into floats and vice-versa.

Example:

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

It has many more helper functions to manipulate binary strings such as: shift, add, fill, to_exponential, invert...

PS: Shameless plug, I'm the author of this package.

于 2021-07-16T21:15:57.327 回答