单元测试(有时)失败,因为浮点不精确

Nik*_*s R 60 python floating-point unit-testing

我有一个Vector类代表三维空间中的一个点.该向量具有normalize(self, length = 1)向下/向上缩放向量的方法length == vec.normalize(length).length.

由于浮点数不精确,此方法的unittest 有时会失败.我的问题是,如何在正确实施方法时确保此测试不会失败?是否可以在测试近似值的情况下进行?



其他信息:

    def testNormalize(self):
        vec = Vector(random.random(), random.random(), random.random())
        self.assertEqual(vec.normalize(5).length, 5)
Run Code Online (Sandbox Code Playgroud)

有时导致AssertionError: 4.999999999999999 != 5或者AssertionError: 5.000000000000001 != 5.

注意:我知道浮点问题可能在Vector.length属性中或在Vector.normalize().

Rik*_*ggi 104

1)如何确保测试有效?

assertAlmostEqual,assertNotAlmostEqual.

官方文档:

assertAlmostEqual(first, second, places=7, msg=None, delta=None)
Run Code Online (Sandbox Code Playgroud)

通过计算差值,舍入到给定的小数位数(默认值为7)并比较为零,测试第一个和第二个大致相等.

2)是否可以在不测试近似值的情况下进行?

没有.

浮点问题无法绕过,所以你或者"圆圆"将给出结果vec.normalize,或接受一个几乎相等的结果(这两个中的每一个是一个近似值).