[英]Assert two variables are almost equal in python
這里有兩個變量: earnings_forecast
, actual_earning
(數值變量)
我想斷言這兩個變量是否相等,並且相對於actual_earning
變量可接受 ±2% 的差異。
假設: actual_earnings = 5.19
earnings_forecast = 6
actual_earnings = 5.19
我不能使用assertEqual(earnings_forecast, actual_earnings)
因為它會嘗試進行精確匹配,相反我想斷言這兩個變量幾乎相等,±2% 的差異是可以接受的。
您可以使用 Python 3.5 中引入的新 isclose 函數
PEP 485 添加了 math.isclose() 和 cmath.isclose() 函數,它們判斷兩個值是近似相等還是彼此“接近”。 根據給定的絕對和相對容差確定兩個值是否接近。 相對容差是 isclose 參數之間允許的最大差異,相對於較大的絕對值
import math
a = 100.0
b = 102.0
c = 103.0
assert math.isclose(a,b, rel_tol=0.02)
assert math.isclose(a,c, rel_tol=0.02)
abs(earnings_forecast - actual_earning) < 0.01 * abs(earnings_forecast + actual_earning)
是一種很好的方法,它可以讓您在任何一側都有很好的對稱 2% 差異。 它也不會遭受由於其中一個值為零而可能出現的陷阱。
還有其他定義,但與上面的定義一樣,它們各有優缺點。
只需定義一個新測試:
def assertNearlyEqual(self,a,b,fraction=0.02,msg=None):
if abs(a-b) > abs(fraction*a):
if msg is None:
self.fail("The given numbers %s and %s are not near each other."%(a,b))
else:
fail(msg)
並用你的兩個變量調用它:
self.assertNearlyEqual(earnings_forecast,actual_earning)
簡單的方法:
a, b = sorted(map(float, (a, b)))
assert a + abs(a)*1.02 >= b
您可以在測試中使用自定義Testcase
子類:
class FooTestCase(TestCase):
def assertAlmostEqual(a, b):
a, b = sorted(map(float, (a, b)))
self.assertTrue(a + abs(a)*1.02 >= b)
對於那些仍然使用 Python 2.x 的人,你也可以使用numpy.isclose()
from numpy import isclose as isclose
a = 100.0
b = 100.01
print isclose(a,b, atol=0.02) # True
從文檔:
對於有限值,isclose 使用以下等式來測試兩個浮點值是否相等。
absolute(a - b) <= (atol + rtol * absolute(b))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.