在python中,两个变量几乎相等

在python中,两个变量几乎相等,python,python-unittest,Python,Python Unittest,这里有两个变量:盈利预测,实际盈利(数字变量) 我想断言这两个变量是否相等,相对于实际收入变量的差异±2%是可以接受的 假设: 收益预测=6 实际收入=5.19 我不能使用assertEqual(收益预测,实际收益),因为它将尝试进行精确匹配,相反,我想断言这两个变量几乎相等,可以接受±2%的差异。abs(收益预测-实际收益)

这里有两个变量:
盈利预测
实际盈利
(数字变量)

我想断言这两个变量是否相等,相对于
实际收入
变量的差异±2%是可以接受的

假设:
收益预测=6
实际收入=5.19

我不能使用assertEqual(收益预测,实际收益),因为它将尝试进行精确匹配,相反,我想断言这两个变量几乎相等,可以接受±2%的差异。

abs(收益预测-实际收益)<0.01*abs(收益预测+实际收益)
abs(earnings_forecast - actual_earning) < 0.01 * abs(earnings_forecast + actual_earning)
这是一个很好的方法,它可以给你两边2%的差异。它也不会因为其中一个值为零而出现陷阱


还有其他定义,但与上面的定义一样,它们也有各自的优缺点。

您可以使用Python 3.5中引入的新isclose函数

PEP 485添加了math.isclose()和cmath.isclose()函数 说明两个值是近似相等还是“接近” 其他的。确定两个值是否视为接近 根据给定的绝对和相对公差。相对的 容差是isclose参数之间允许的最大差值, 相对于较大的绝对值


只需定义一个新的测试:

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)

对于仍然使用Python2.x的用户,您也可以使用

从文件中:

对于有限值,isclose使用以下等式来测试 两个浮点值是等价的

absolute(a - b) <= (atol + rtol * absolute(b))

绝对值(a-b)其中的百分之二?无论如何,只需计算差异并断言其绝对值小于您想要的数字。这些是数值还是任何对象?实现您自己的
compare
函数,该函数将返回
True
False
,并使用
unittest
内置
assertTrue
(假设内置的
assertAlmostEqual
在这种情况下没有帮助)。Assert两个值可能重复
tc=unittest.TestCase(“'uu init''tc.assertEqual(a,b)
@schwobasegll:仅当它们是复数时;-)注意符号。@schwobasegl:touche.看起来不一致。预测值为100时,实际收入为98将导致
错误
,但实际收入为102将导致
正确
,即使两者与100相差2%。是的。它确实有奇趣,但其他的计划也会。哦,那太时髦了。废弃我的方式。等价于abs(a-b)Numpy也有类似的实现:以及基于数组的等价物,它可以提高大型数据集的性能。
from numpy import isclose as isclose
a = 100.0
b = 100.01

print isclose(a,b, atol=0.02)  # True
absolute(a - b) <= (atol + rtol * absolute(b))