簡體   English   中英

在python中斷言兩個變量幾乎相等

[英]Assert two variables are almost equal in python

這里有兩個變量: earnings_forecastactual_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM