【问题标题】:How to convert floating point number in python?如何在python中转换浮点数?
【发布时间】:2013-10-16 22:11:00
【问题描述】:

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

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

【问题讨论】:

  • 这个输出是如何得出的?

标签: python floating-point hex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    当然还有其他方法可以进行这种对话,但除非你指定你想要哪种方法,否则没有人可以帮助你。

    【讨论】:

      【解决方案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
      

      【讨论】:

      • @user2601010 这取决于你如何打包和解包字节,但我不知道你如何得到你提到的输出。
      【解决方案4】:

      如果input 已经是浮点数,请尝试float.hex(input)

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 是的。仅适用于整数
        • 这个数字是如何转换成 3403244E 的?我不明白,也许我能正确回答这个问题。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多