Python中浮点数四舍五入的问题

9 投票
3 回答
10523 浏览
提问于 2025-04-17 00:49

我在使用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

撰写回答