我需要编写一个函数来检查一个数字是否在另一个数字的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”。有没有办法让它更简单?
答案 0 :(得分:6)
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
source,它最有可能获得最高效率。 (可以找到它的python版本here
)
对于旧版本的Python,您可以使用已经指出的解决方案,或者查看math.isclose()
如何实现并获得灵感。
请注意,在大多数情况下,应指定rel_tol
,除非处理0
附近的值。此外,对于应评估数组元素的情况,最有效的用法可能是由 numpy.isclose()
函数提供的。
答案 1 :(得分:5)
你可以做到
def IsCloseEnough(num1, num2 ):
return abs(float(num1 - num2) / float(num1)) < 0.1
答案 2 :(得分:4)
我认为最清晰的方式非常接近你的功能,只有一些改动:
if/else
像这样:
def isCloseEnough(num1, num2):
return num1 * 0.9 < num2 < num1 * 1.1