繁体   English   中英

Python浮点精度格式说明符

[英]Python floating-point precision format specifier

假设我有一些32位数字和一些64位数字:

>>> import numpy as np
>>> w = np.float32(2.4)
>>> x = np.float32(4.555555555555555)
>>> y = np.float64(2.4)
>>> z = np.float64(4.555555555555555)

我可以用%f打印出来但它有额外的,不需要的小数:

>>> '%f %f %f %f' % (w, x, y, z)
'2.400000 4.555555 2.400000 4.555556'

我可以使用%g但似乎有一个小的默认精度:

>>> '%g %g %g %g' % (w, x, y, z)
'2.4 4.55556 2.4 4.55556'

我想我应该使用类似于.7的32位值和.15的64位值:

>>> '%.7g %.7g %.15g %.15g' % (w, x, y, z)
'2.4 4.555555 2.4 4.55555555555556'

这似乎工作得相当好,但精度数也用于小数位前面的数字,例如34567.375768。

总之,将浮点值序列化为文本的正确方法是什么,以便为32位和64位值保留适当的精度,但不使用任何不必要的空间?

更新

认为输出应该是的例子:

number                float32     float64
5                     5           5
0.1                   0.1         0.1
2.4                   2.4         2.4
4.555555555555555     4.5555553   4.5555555555555554
12345678.92345678635  12345679.0  12345678.923456786

我得到了什么.7 / .16。 这实际上看起来没问题:

>>> 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)
>>> ('%.7g ' * len(v32)) % tuple(v32)
'5 0.1 2.4 4.555555 1.234568e+07 '
>>> ('%.16g ' * len(v64)) % tuple(v64)
'5 0.1 2.4 4.555555555555555 12345678.92345679 '

您可以尝试使用np.finfo函数来获得与float相对应的精度

finfo32 = np.finfo(np.float32)
finfo64 = np.finfo(np.float64)

finfo32.resolution = 1e-6
finfo64.resolution = 1e-15

既然你知道你想要多少小数,比如6,只需使用一个rstrip("0")去掉不必要的0:

print ("%.6f" % your_float).strip("0")

如果你倾向于%g ,也许你可能想要使用动态格式,例如:

>>> strf = lambda v: ("%%.%ig" % max(np.ceil(np.log10(v)), 7)) % v
>>> strf(123.456789)
'123.45679'
>>> strf(123456789.12345)
'123456789'

我不确定你想要完成什么。 但是,这可能会有所帮助。 你写了

这似乎工作得相当好,但精度数也用于小数位前面的数字,例如34567.375768。

您可以使用%f而不是g 从Python 文档

精度是一个十进制数,表示对于用'f'和'F'格式化的浮点值,或者在用'g'格式化的浮点值的小数点前后,应在小数点后显示多少位数或'G'。

>>> z = np.float64(4.555555555555555)
>>> "%.3f" % z
'4.556'
>>> q = np.float64(2131234.555555555555555)
>>> "%.3f" % q
'2131234.556'
>>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM