Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中使用Numpy的浮点舍入错误_Python_Numpy_Rounding Error - Fatal编程技术网

Python中使用Numpy的浮点舍入错误

Python中使用Numpy的浮点舍入错误,python,numpy,rounding-error,Python,Numpy,Rounding Error,我有一个问题,我相信与浮标和精度有关,但我对涉及的各种复杂问题不是很精通。我是一个数学爱好者,在我看来,我可能仍然只是在黑板上用小数。我将开始对此进行研究,但与此同时,我想知道是否有一些通用的技术可以解决我将在下面概述的问题 我有一个小数的numpy数组,我想四舍五入到最接近的.02。我最初是通过将数组中的每个元素除以.02,将结果四舍五入,然后再乘以.02来实现的。实际数据是由一些处理输入的代码生成的,但这说明了问题: x = np.array([.45632, .69722, .40692]

我有一个问题,我相信与浮标和精度有关,但我对涉及的各种复杂问题不是很精通。我是一个数学爱好者,在我看来,我可能仍然只是在黑板上用小数。我将开始对此进行研究,但与此同时,我想知道是否有一些通用的技术可以解决我将在下面概述的问题

我有一个小数的numpy数组,我想四舍五入到最接近的.02。我最初是通过将数组中的每个元素除以.02,将结果四舍五入,然后再乘以.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
但是,


正如我所说,我对这个特殊的应用程序有一个变通方法,但我想知道是否有人有办法让我的第一种方法起作用,或者是否有一些技术可以处理这些类型的数字,这些技术更一般,我应该知道

Python的
格式也可以用于此

print format(xx[1], '.100f')
此代码返回
xx[1]

xx[1]=0.70000000000000661338147750939242541790008544921875

您可以通过下面显示的代码检查这些

if xx[1] == 0.70000000000000006661338147750939242541790008544921875:
    print 'true'

不要使用
==
来选择数据子集,而是尝试使用。这允许您为比较指定相对/绝对公差
(绝对(a-b)您可能应该在不使用==运算符的情况下比较浮点数。相反,将数字与一系列值进行比较,例如“
xx[0]
在0.46的1e-10范围内?”。或者,不要使用浮点数(将每个数字保存为实际数字的100倍).hav看一看isclose或allclose in(numpy)[强制性链接:我实际上要回答我自己的问题,并建议一个可容忍的差异和<运算符,但这是一个需要了解的有用的小函数。链接已断开(无法编辑):
if xx[1] == 0.70000000000000006661338147750939242541790008544921875:
    print 'true'