我需要编写一个函数来检查一个数字是否在10%
另一个数字的范围内.
我写了这个函数:
def IsCloseEntough(num1, num2 ): percent = num1/100 if num1-percent < num2 and num2< num1+percent: return True; else: return False;
它返回True
如果 num1-10% of num1 < num2 < num1+10%
.这解决了问题,但感觉这个代码不是非常"Python Like".有没有办法让它更简单?
PEP 0485推出的math.isclose()
功能(和它的复杂的表妹cmath.isclose()
制造这些类型的检查;它还会检查特殊值,如NaN
,Inf
等人的明显缺点是,它仅出现在Python 3.5
从我所知道的,它仍然在它的起步阶段,因此将来可能会有一些改头换面.
基本功能:
math.isclose(1, 1.09, abs_tol=0.1) Out[20]: True math.isclose(1.0, 1.2, abs_tol=0.1) Out[23]: False math.isclose(1.0, 0.9, abs_tol=0.1) Out[24]: True
这是一个内置的(因此你可以有效地使用它filter()
),它可以检查两个数字的接近程度,并在尝试查找近似值时提供更大的灵活性.
在内部,它abs
以类似的方式使用解决方案,为您自己查看C
源代码,它最有可能获得它的效率.(可以找到它的python版本here
)
对于旧版本的Python,您可以使用已经指出的解决方案,或者查看如何math.isclose()
实现并获得灵感.
请注意,在大多数情况下rel_tol
应该指定,除非处理附近的值0
.另外,对于应该评估数组元素的情况,最有效的用法可能是由numpy.isclose()
函数提供的.
你可以做
def IsCloseEnough(num1, num2 ): return abs(float(num1 - num2) / float(num1)) < 0.1