Python 中等效于 BitConverter.DoubleToInt64Bits 的方法
我觉得要真正理解双精度数字,最好的方法就是多玩玩它们。我想做的一件事就是看看它们的(几乎是)二进制表示。在C#中,BitConverter.DoubleToInt64Bits
这个函数非常有用,因为它可以把数字转换成十六进制,让我看到浮点数的“真实”本质。
不过,我似乎找不到Python中等效的函数,有没有办法在Python中实现和BitConverter.DoubleToInt64Bits
一样的功能呢?
谢谢。
编辑:
下面有个回答建议使用usinginascii.hexlify(struct.pack('d', 123.456)
来把双精度数转换成十六进制表示,但我得到的结果还是很奇怪。
比如,
inascii.hexlify(struct.pack('d', 123.456))
确实返回了'77be9f1a2fdd5e40'
,但是如果我运行在C#中应该等效的代码,也就是
BitConverter.DoubleToInt64Bits(123.456).ToString("X")
我得到的数字完全不同:"405EDD2F1A9FBE77"
。我哪里出错了呢?
1 个回答
3
你觉得用 struct.pack
和 binascii.hexlify
这样的方法怎么样呢?
>>> import binascii
>>> import struct
>>> struct.pack('d', 0.0)
'\x00\x00\x00\x00\x00\x00\x00\x00'
>>> binascii.hexlify(struct.pack('d', 0.0))
'0000000000000000'
>>> binascii.hexlify(struct.pack('d', 1.0))
'000000000000f03f'
>>> binascii.hexlify(struct.pack('d', 123.456))
'77be9f1a2fdd5e40'
在这里,d
代表的是一种叫做 double
的数据类型,它占用8个字节,也就是64位。如果你想了解其他的数据类型格式,可以查看 格式字符。
更新
如果你在格式的开头加上 @
、=
、<
、>
或 !
,就可以指定字节的顺序了。具体可以参考 字节顺序、大小和对齐。
>>> binascii.hexlify(struct.pack('<d', 123.456)) # little-enddian
'77be9f1a2fdd5e40'
>>> binascii.hexlify(struct.pack('>d', 123.456)) # big-endian
'405edd2f1a9fbe77'