Python 中等效于 BitConverter.DoubleToInt64Bits 的方法

1 投票
1 回答
1166 浏览
提问于 2025-04-18 14:43

我觉得要真正理解双精度数字,最好的方法就是多玩玩它们。我想做的一件事就是看看它们的(几乎是)二进制表示。在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.packbinascii.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'

撰写回答