首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有“works”的python unittest2 assertAlmostEqual工作不正确

带有“works”的python unittest2 assertAlmostEqual工作不正确
EN

Stack Overflow用户
提问于 2015-02-24 13:14:08
回答 2查看 263关注 0票数 1

我正在处理unittest2的下列问题

代码语言:javascript
复制
assertAlmostEqual(69.88, 69.875, places=2)  # returns True

代码语言:javascript
复制
assertAlmostEqual(1.28, 1.275, places=2)  # returns False

我认为问题在于assertAlmostEqual方法:

代码语言:javascript
复制
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)

应否改为:

代码语言:javascript
复制
if abs(round(second, places) - round(first, places)) == 0
    return
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-24 13:18:52

您建议的修补程序没有任何区别,因为您可以很容易地演示:

代码语言:javascript
复制
>>> 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不能准确表示:

代码语言:javascript
复制
>>> "{:.40f}".format(69.88)
'69.8799999999999954525264911353588104248047'
票数 2
EN

Stack Overflow用户

发布于 2015-02-24 13:21:47

第二个例子的不同之处是

0.005

即使没有提到浮点数的偏差,圆的结果也是0.01,所以这些数字在两个位置的精度上是不同的。

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

因此,问题不在于实现,而在于您的期望,这不同于普通的浮点比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28696783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档