Python浮点精度格式说明符

Python浮点精度格式说明符,python,numpy,floating-point,precision,Python,Numpy,Floating Point,Precision,假设我有一些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打印出来,但它有多余的小数: >>> '%

假设我有一些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'
我在想我应该对32位值使用
.7
,对64位值使用
.15

>>> '%.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 '
您可以尝试使用该函数来获得与浮点相对应的精度

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”


对我来说,你想要哪种输出并不十分清楚。您能提供您想要的具体输出吗?我只需要使用strip('0')来删除尾随的零。
“%.3f”%z
->'4.556',
“%.3f”%q
->'2131234.556'?为什么“%.16g”(我认为.16是正确的)不完全符合您的需要?总是16个重要人物。。。您也可以只使用“%r”(表示),这可能是相同的结果。“前面用光了”听起来好像你对浮点有些误解?小数点前面的数字也用光了精度数字是一个特性。由于这些数字也占据了空间,它们与小数点后的数字一样重要。当一个人提到有效的15或7位数时,数字计数总是指总位数。然后将“3”更改为另一个值。我仍然没有完全得到你们想要的。更新后的问题,我认为
%g
确实做到了我想要的to@jterrace:我不确定,请用“%.7g”检查
v32
的最后一个条目。奇怪的是
1.234568e+07
而不是
1.234569e+07
?这就是
%g
的作用。。如果效率更高,它会使用
%e
。事实上,我对科学符号的理解是的,这个例子是我认为答案应该是的,但我想%g是可以的。仍然不确定应该使用什么样的精度来确保不丢失精度
>>> z = np.float64(4.555555555555555)
>>> "%.3f" % z
'4.556'
>>> q = np.float64(2131234.555555555555555)
>>> "%.3f" % q
'2131234.556'
>>>