我正在处理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发布于 2015-02-24 13:18:52
您建议的修补程序没有任何区别,因为您可以很容易地演示:
>>> places = 2
>>> first, second = 69.88, 69.875
>>> round(abs(second-first), places)
0.0
>>> abs(round(second, places) - round(first, places))
0.0这是一个浮点精度问题,参见例如Is floating point math broken? 69.88不能准确表示:
>>> "{:.40f}".format(69.88)
'69.8799999999999954525264911353588104248047'发布于 2015-02-24 13:21:47
第二个例子的不同之处是
0.005
即使没有提到浮点数的偏差,圆的结果也是0.01,所以这些数字在两个位置的精度上是不同的。
这种方法比较了数字之间的差异。这实际上是比较浮点数的标准。
因此,问题不在于实现,而在于您的期望,这不同于普通的浮点比较。
https://stackoverflow.com/questions/28696783
复制相似问题