使用Numpy的Python浮点数舍入错误
我遇到了一个问题,我觉得这和浮点数以及精度有关,但我对这些细节不是很了解。我是个数学爱好者,在我看来,我可能还在黑板上用小数进行计算。我会开始学习这方面的知识,但在此之前,我想知道有没有一些通用的方法可以帮助我处理浮点数,以解决我下面要描述的问题。
我有一个包含小数的numpy数组,我想把它们四舍五入到最接近的0.02。我最开始是通过把数组中的每个元素都除以0.02,四舍五入结果,然后再乘以0.02来实现的。实际的数据是通过一些代码处理输入生成的,但这个例子可以说明问题:
x = np.array([.45632, .69722, .40692])
xx = np.round(x/.02)*.02
看起来这个方法能正确地四舍五入,因为我可以检查结果:
xx
array([0.46, 0.7, 0.4])
然而,当我检查第一个和第二个元素时,我得到了:
xx[0]
0.46000000000000002
xx[1]
0.70000000000000007
数组中的每个元素都是numpy.float64类型。问题出现在后面,因为我用这些数字进行比较操作来选择数据的子集,这时候的结果有点不可预测:
xx[0] == .46
True
但是,
xx[1] == .70
False
正如我所说的,我有一个解决这个特定应用的替代方法,但我想知道有没有人能让我的第一种方法有效,或者有没有更通用的处理这类数字的技巧我应该了解。
2 个回答
1
Python的format
也可以用来做这个。
print format(xx[1], '.100f')
这段代码会返回xx[1]
的实际值。
也就是说,xx[1] = 0.70000000000000006661338147750939242541790008544921875
你可以通过下面的代码来检查这些。
if xx[1] == 0.70000000000000006661338147750939242541790008544921875:
print 'true'
5
与其使用 ==
来选择数据的子集,不如试试 numpy.isclose()。这个方法可以让你为比较设置一个相对或绝对的容忍度,意思是说它会检查两个数之间的差距是否在你设定的范围内 (绝对值(a - b) <= (绝对容忍度 + 相对容忍度 * 绝对值(b)))
。