numpy Python中舍入浮点数的问题

vsikbqxv  于 2023-03-02  发布在  Python
关注(0)|答案(3)|浏览(184)

我在使用np.round,np.around时遇到了一个问题,它没有正确舍入,我不能包含代码,因为当我手动设置值时(与使用my data相反),返回值有效,但下面是输出:

In [177]: a
Out[177]: 0.0099999998

In [178]: np.round(a,2)
Out[178]: 0.0099999998

In [179]: np.round(a,1)
Out[179]: 0.0

我漏掉了什么?a的dtype是float32,我需要修改吗?

mcvgt66p

mcvgt66p1#

尝试创建np.float32(0.01),您将看到您的答案。您正在获得您已经可以获得的精度。

>>> import numpy as np
>>> x = 0.01
>>> epsilon = 0.01 - np.float32(0.01)
>>> for n in np.arange(x - 10*epsilon, x + 10*epsilon, epsilon):
...     print(repr(np.float32(n)))
...     
0.0099999979
0.0099999979
0.0099999979
0.0099999988
0.0099999988
0.0099999988
0.0099999988
0.0099999998
0.0099999998
0.0099999998
0.0099999998
0.0099999998
0.010000001
0.010000001
0.010000001
0.010000001
0.010000002
0.010000002
0.010000002
0.010000002
ee7vknir

ee7vknir2#

注意,python的round函数和numpy.float64类型似乎有问题,见下例:

In [88]: round(np.float64(16.259766999999947), 4)
Out[88]: 16.259799999999998

我唯一能解决这个问题的方法是在使用round函数之前将numpy.float64转换为float,如下所示:

In [89]: round(float(np.float64(16.259766999999947)), 4)
Out[89]: 16.2598
bkhjykvo

bkhjykvo3#

如果数字是python的float或np.float64,它就不起作用。
一旦我把数字改为np.float32(),它就工作了!
type(85.10000000000001), np.round(85.10000000000001,decimals=2), np.round(np.float32(85.10000000000001),decimals=2)
结果:(浮点数,85.1000000000001,85.1)

相关问题