在浮点数0.01输出0.009999999776482582上使用struct pack和unpack。

时间:2016-08-30 16:57:53

标签: python

使用' struct pack并解压缩'浮点数0.01输出0.009999999776482582。 对于我的项目,我将不得不配置浮点值 同样需要存储在二进制文件中,我需要以后分析这些数据,我需要配置的确切值。

如果有任何方法我可以存储精确值0.01并检索相同值,那么有人可以帮助我。

基于一些帖子我已经尝试过使用double而不是float它可以工作但是使用double的问题是我的文件大小增加了。我有很多浮动参数,可以取0到5之间的任何值。 因此,任何其他建议将不胜感激。

以下是示例代码

import struct
a = 0.01
b = struct.pack('<f', a)
c = struct.unpack('<f', b)
print c
(0.009999999776482582,)

2 个答案:

答案 0 :(得分:2)

没有浮点数0.01。 IEEE浮点数不代表整个实数行;它们代表使用特定二进制方案的近似值。最接近的近似值为十进制表示0.009999999776482582。

您可以尝试序列化文本表示(例如json)或pickle可以表示任意精度的BigDecimal。

答案 1 :(得分:2)

你说数字从0到5.如果你只需要两个小数位(0.00,0.01,...,5.00)那么你可以将数字存储为16位整数,首先将数字乘以100,然后在阅读时将数字除以100:

>>> import struct
>>> digits = 2
>>> a = 0.01
>>> b = struct.pack('<H', int(round(a, digits)) * (10 ** digits))
>>> c = struct.unpack('<H', b)
>>> print (c[0] / (10.0 ** digits))
0.01

使用H格式存储数字与浮点数相比,实际上可以节省50%的空间。如果你需要更多精度,超过两位小数,你需要乘以数字然后除以1000,10000等,将格式从H改为I.