使用 Numpy 在 Python 中对浮点数进行舍入误差

use*_*714 6 python numpy rounding-error

我遇到了一个问题,我认为这与使用浮点数和精度有关,但我不太熟悉所涉及的各种复杂问题。我是一个数学家,在我看来,我可能还只是在黑板上处理小数。我将开始研究这一点,但与此同时,我想知道是否有任何使用浮点数的通用技术可以解决我将在下面概述的问题。

我有一个 numpy 小数数组,我想将其四舍五入到最接近的 0.02。我最初通过将数组的每个元素除以 0.02、对结果进行四舍五入,然后再次乘以 0.02 来实现此目的。实际数据是由一些处理输入的代码生成的,但这说明了问题:

x = np.array([.45632, .69722, .40692])
xx = np.round(x/.02)*.02
Run Code Online (Sandbox Code Playgroud)

正如我可以检查的那样,它似乎正确地舍入了所有内容:

xx
array([0.46, 0.7, 0.4])
Run Code Online (Sandbox Code Playgroud)

但是,如果我检查第一个和第二个元素,我会得到:

xx[0]
0.46000000000000002
xx[1]
0.70000000000000007
Run Code Online (Sandbox Code Playgroud)

数组中的每个元素都是 numpy.float64 类型。问题稍后出现,因为我将这些数字与比较运算符结合起来以选择数据的子集,然后发生的情况有点难以预测:

xx[0] == .46
True
Run Code Online (Sandbox Code Playgroud)

但,

xx[1] == .70
False
Run Code Online (Sandbox Code Playgroud)

正如我所说,我有针对这个特定应用程序的解决方法,但我想知道是否有人有办法使我的第一种方法发挥作用,或者是否有处理这些类型的数字的技术,这些技术比我应该更通用意识到。

Joe*_*oom 5

尝试使用numpy.isclose() ,而不是用于==选择数据子集。这允许您为比较指定相对/绝对容差(absolute(a - b) <= (atol + rtol * absolute(b)))