让我们假设我们有一个表示二进制分数的字符串,例如:
".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中是否有内置或标准的方法?
答案 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:无耻的插件,我是这个包的作者。