Python python struct.unpack 读取二进制浮点数误差?

knowway · 2023年09月15日 · 最后由 优雅的测试媛 回复于 2023年09月20日 · 3918 次阅读

将浮点数 123.456 用网络字节序序列化:
float_value = 123.456
float_stream = struct.pack("! f", float_value)
然后再反序列化:
get_float_value = struct.unpack("! f", float_stream)
这时候得到的数据变成了 123.45600128173828

这不符合我的需求,我的需求要求反序列化后的结果必须是 123.456,请问大神应该怎么解决呀?

共收到 7 条回复 时间 点赞

强制下格式

恒温 回复

能不能说的再详细一点呀?怎么个强制下格式?

来自 chatgpt 的回答

import struct

浮点数

float_num = 123.456

将浮点数转换为字符串

float_str = str(float_num)

将字符串转换为字节序列

data = float_str.encode()

使用 struct.pack 进行打包

packed_data = struct.pack(f'{len(data)}s', data)

使用 struct.unpack 进行解包

unpacked_data = struct.unpack(f'{len(data)}s', packed_data)

转换回浮点数

result = float(unpacked_data[0].decode())

print(result) # 输出 123.456

这样是不行的。
因为在打包的时候,我不能把 float_str.encode() 以后的长度也打包进二进制序列里边。
那么如果没有这个长度,解包(反序列化)的一方,是没有办法正确解出来的。

自己额外处理下不就好了

Nightwish 回复

大佬能详细说一下吗?

7楼 已删除

我试了下,get_float_value 是个 tuple,如果只想要第一个元素就 "{:.3f}".format(get_float_value[0])下,也可以用 round()。
如果还想 tuple 类型,就先这样:
force_transform_value = "{:.3f}".format(get_float_value[0])
tuple([eval(force_transform_value)])

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册