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

avi*_*avi 2 python

我需要编写一个函数来检查一个数字是否在10%另一个数字的范围内.

我写了这个函数:

def IsCloseEntough(num1, num2 ):
    percent = num1/100
    if num1-percent < num2 and num2< num1+percent:
       return True;
    else:
       return False;
Run Code Online (Sandbox Code Playgroud)

它返回True如果 num1-10% of num1 < num2 < num1+10%.这解决了问题,但感觉这个代码不是非常"Python Like".有没有办法让它更简单?

Jim*_*ard 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
Run Code Online (Sandbox Code Playgroud)

这是一个内置的(因此你可以有效地使用它filter()),它可以检查两个数字的接近程度,并在尝试查找近似值时提供更大的灵活性.

在内部,它abs以类似的方式使用解决方案,为您自己查看C源代码,它最有可能获得它的效率.(可以找到它的python版本here)

对于旧版本的Python,您可以使用已经指出的解决方案,或者查看如何math.isclose()实现并获得灵感.


请注意,在大多数情况下rel_tol应该指定,除非处理附近的值0.另外,对于应该评估数组元素的情况,最有效的用法可能是由numpy.isclose()函数提供的.


tob*_*s_k 5

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

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

像这样:

def isCloseEnough(num1, num2):
    return num1 * 0.9 < num2 < num1 * 1.1
Run Code Online (Sandbox Code Playgroud)


MaT*_*aTh 5

你可以做

def IsCloseEnough(num1, num2 ):
     return abs(float(num1 - num2) / float(num1)) < 0.1 
Run Code Online (Sandbox Code Playgroud)