【问题标题】:How to convert a string representing a binary fraction to a number in Python如何将表示二进制分数的字符串转换为Python中的数字
【发布时间】:2012-11-19 17:16:06
【问题描述】:

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

".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 中执行此操作的内置或标准方法?

【问题讨论】:

  • 出于好奇,你需要这个做什么?

标签: python binary fractions


【解决方案1】:

您可以使用Binary fractions 包。使用此包,您可以将二进制分数字符串转换为浮点数,反之亦然。

例子:

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

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

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

【讨论】:

    【解决方案2】:

    如果您将硬编码的“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】:

      抑制点而不是在其上分裂是合理的,如下所示。这个 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
      

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

        • 确实,这样更简洁;谢谢NPE。不过,我认为这证实了我的怀疑,即python(或标准/流行模块)中没有任何东西可以处理这种转换?如果没有必要,我只想不要重新发明轮子。谢谢!
        • @TomScrace:是的,你说得对,没有内置任何东西。十六进制也有类似的东西,形式为float.fromhex。但这真的不是一个很普遍的需求。
        猜你喜欢
        • 1970-01-01
        • 2019-05-14
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2019-06-22
        • 2015-07-25
        • 2012-06-21
        • 1970-01-01
        相关资源
        最近更新 更多