如何在python中转换浮点数?

2024-06-17 12:09:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,如何将浮点数转换为16进制数,每32位FLP数8位十六进制数?

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


Tags: inputoutput浮点数wantedflp
3条回答

您的预期输出有问题:

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

输出:

60dc9cc9

如果您想要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'

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

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

  • 可以将此浮点值编码为其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无关,所以也许你想澄清你的确切意思。

当然还有其他的方法可以进行这种对话,但是除非你明确说明你想要哪种方法,否则没人可能会帮助你。

相关问题 更多 >