假设我有一些 32 位和 64 位浮点值:
>>> import numpy as np
>>> v32 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635],
dtype=np.float32)
>>> v64 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635],
dtype=np.float64)
我想在不丢失精度的情况下将这些值序列化为文本(或者至少非常接近不丢失精度)。我认为这样做的规范方法是repr
:
>>> map(repr, v32)
['5.0', '0.1', '2.4000001', '4.5555553', '12345679.0']
>>> map(repr, v64)
['5.0', '0.10000000000000001', '2.3999999999999999', '4.5555555555555554',
'12345678.923456786']
但是我想让表示尽可能紧凑以最小化文件大小,所以如果像 2.4 这样的值在没有额外小数的情况下被序列化会很好。是的,我知道这是他们实际的浮点表示,但%g
似乎能够解决这个问题:
>>> ('%.7g ' * len(v32)) % tuple(v32)
'5 0.1 2.4 4.555555 1.234568e+07 '
>>> ('%.16g ' * len(v32)) % tuple(v64)
'5 0.1 2.4 4.555555555555555 12345678.92345679 '
我的问题是:%g
以这种方式使用是否安全?是否.7
和.16
正确的值,这样精度就不会丢失?