如何在python中转换浮点数?

时间:2013-10-16 22:11:01

标签: python floating-point hex

如何在Python中将浮点数转换为基数为16的数字,每32位FLP数为8个十六进制数?

例如:input = 1.2717441261e+20 output wanted : 3403244E

5 个答案:

答案 0 :(得分:6)

如果您需要IEEE-754表示的字节值,struct模块可以执行此操作:

>>> import struct
>>> f = 1.2717441261e+20
>>> struct.pack('f', f)
'\xc9\x9c\xdc`'

这是字节的字符串版本,然后可以将其转换为十六进制值的字符串表示形式:

>>> struct.pack('f', f).encode('hex')
'c99cdc60'

并且,如果你想要它作为十六进制整数,解析它:

>>> s = struct.pack('f', f).encode('hex')
>>> int(s, 16)
3382500448

将整数显示为十六进制:

>>> hex(int(s, 16))
'0xc99cdc60'

请注意,这与您问题中的十六进制值不匹配 - 如果您的值是您想要的正确值,请更新问题以说明它是如何派生的。

答案 1 :(得分:3)

有几种可能的方法,但没有一种方法可以达到你想要的结果。

  • 您可以将此浮点值编码为其IEEE二进制表示形式。这确实导致32位数(如果你用单精度进行)。但无论我认为哪种字节序都会产生不同的结果:

    import struct
    struct.pack("<f", 1.2717441261e+20).encode("hex")
    # -> 'c99cdc60'
    struct.pack(">f", 1.2717441261e+20).encode("hex")
    # -> '60dc9cc9'
    
    struct.unpack("<f", "3403244E".decode("hex"))
    # -> (687918336.0,)
    struct.unpack(">f", "3403244E".decode("hex"))
    # -> (1.2213533295835077e-07,)
    
  • 由于另一个不符合结果,我会采取其他答案并将其包含在这里:

    float.hex(1.2717441261e+20)
    # -> '0x1.b939919e12808p+66'
    

    3403244E无关,所以也许你想澄清一下你究竟是什么意思。

肯定有其他方式可以进行此对话,但除非您指定所需的方法,否则没有人可以帮助您。

答案 2 :(得分:1)

您的预期输出有问题:

import struct
input = 1.2717441261e+20
buf = struct.pack(">f", input)
print ''.join("%x" % ord(c) for c in struct.unpack(">4c", buf) )

输出:

60dc9cc9

答案 3 :(得分:0)

试试float.hex(input)。这应该将一个数字转换为表示基数为16的数字的字符串,并且与hex()不同,它与浮点数一起使用。该字符串将以0x开头,并且在小数点后将包含13位数字,因此我无法帮助您处理8位数部分。

来源:http://docs.python.org/2/library/stdtypes.html#float.hex

答案 4 :(得分:0)

如果float.hex(input)已经是浮动广告,请尝试input