Python中浮点数四舍五入的问题
我在使用np.round和np.around的时候遇到了问题,它们没有正确地进行四舍五入。我不能提供代码,因为当我手动设置一个值(而不是用我的数据)时,返回的结果是正常的,但这是我得到的输出:
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的类型是float32,我需要改变这个吗?
3 个回答
0
在我这里,当数字是Python的浮点数或者np.float64时,它不起作用。
一旦我把数字改成np.float32(),就可以正常工作了!
type(85.10000000000001), np.round(85.10000000000001,decimals=2), np.round(np.float32(85.10000000000001),decimals=2)
结果是: (float, 85.10000000000001, 85.1)
3
注意,python的 round
函数在处理 numpy.float64
类型时似乎有点问题。下面是一个例子:
In [88]: round(np.float64(16.259766999999947), 4)
Out[88]: 16.259799999999998
我唯一能解决这个问题的方法是先把 numpy.float64
转换成 float 类型,然后再使用 round 函数,像下面这样:
In [89]: round(float(np.float64(16.259766999999947)), 4)
Out[89]: 16.2598
6
试着创建一个 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