1

我正在处理以下问题unittest2

assertAlmostEqual(69.88, 69.875, places=2)  # returns True

assertAlmostEqual(1.28, 1.275, places=2)  # returns False

我认为问题出在assertAlmostEqual方法上:

def assertAlmostEqual(self, first, second, places=None, ...):
    if first == second:
        # shortcut
        return
    ...
    if delta is not None:
    ...
    else:
        if places is None:
            places = 7

        if round(abs(second-first), places) == 0:
            return

    ...
    raise self.failureException(msg)

它应该是:

if abs(round(second, places) - round(first, places)) == 0
    return
4

2 回答 2

2

您提出的修复没有任何区别,因为您可以轻松地证明:

>>> places = 2
>>> first, second = 69.88, 69.875
>>> round(abs(second-first), places)
0.0
>>> abs(round(second, places) - round(first, places))
0.0

这是浮点精度的问题,请参阅例如浮点数学是否损坏? 69.88不能准确表示:

>>> "{:.40f}".format(69.88)
'69.8799999999999954525264911353588104248047'
于 2015-02-24T13:18:52.337 回答
0

第二个例子的区别是

0.005

即使没有提到浮点数的偏差,轮次结果也会是 0.01,所以这些数字在 2 位精度上确实不同

此方法比较数字之间的差异。实际上是比较浮点数的一种标准

所以问题不在于实现,而在于您的期望,这与常见的浮动比较不同

于 2015-02-24T13:21:47.260 回答