有效地检查数字是否在第二个数字+ -10%的范围内?

时间:2015-12-15 11:37:16

标签: python

我需要编写一个函数来检查一个数字是否在另一个数字的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”。有没有办法让它更简单?

3 个答案:

答案 0 :(得分:6)

PEP 0485引入了 math.isclose() 功能(以及它的复杂表兄 cmath.isclose() 进行这类检查;它还会检查对于特殊值,例如NaNInf等等。明显的缺点是, 出现在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)

我认为最清晰的方式非常接近你的功能,只有一些改动:

  • 检查数字是否在1%以内,不在10%以内
  • 您可以使用比较链
  • 您可以直接返回结果,而不是使用if/else

像这样:

def isCloseEnough(num1, num2):
    return num1 * 0.9 < num2 < num1 * 1.1