我想把二进制数转换成浮点数。以下是一种可能性的示例:
>>> float(-0b1110)
给出了正确的输出:
-14.0
不幸的是,我使用的是二进制字符串,也就是说,我需要像float('-0b1110')
这样的东西。
然而,这不起作用:
>>> float('-0b1110')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): -0b1110
我尝试使用binascii.a2b_qp(string[, header])
,它将带引号的可打印数据块转换回二进制,并返回二进制数据。但最终,我得到了同样的错误:
>>> float(binascii.a2b_qp('-0b1110'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): -0b1110
我理解输出数字是整数的情况,但是如果我想获得数字12.546怎么办?那么二进制字符串的函数调用会是什么样子呢?
发布于 2012-01-06 08:05:11
另一种选择是这样做
from ast import literal_eval
float_str = "-0b101010101"
result = float(literal_eval(float_str))
与内置的"eval“不同,literal_eval即使在用户输入上运行也是安全的,因为它只能解析Python文字-并且不会执行表达式,这意味着它也不会调用函数。
发布于 2016-07-09 22:48:21
这对我很有效。使用Python3.4测试:
def float_to_bin(num):
return bin(struct.unpack('!I', struct.pack('!f', num))[0])[2:].zfill(32)
def bin_to_float(binary):
return struct.unpack('!f',struct.pack('!I', int(binary, 2)))[0]
float_to_bin(bin_to_float(float_to_bin(123.123))) == float_to_bin(123.123)
>>> True
发布于 2012-01-06 07:55:34
float(int('-0b1110',0))
这对我很有效。
如果您有一个表示浮点数而不是整数的64位字符串,则可以执行三步转换-第一步将字符串转换为整数,第二步将其转换为8字节字符串,第三步将这些位重新解释为浮点数。
>>> import struct
>>> s = '0b0100000000101001000101111000110101001111110111110011101101100100'
>>> q = int(s, 0)
>>> b8 = struct.pack('Q', q)
>>> struct.unpack('d', b8)[0]
12.546
当然,您可以将所有这些步骤合并到一行中。
>>> s2 = '0b1100000000101100000000000000000000000000000000000000000000000000'
>>> struct.unpack('d', struct.pack('Q', int(s2, 0)))[0]
-14.0
https://stackoverflow.com/questions/8751653
复制相似问题