比较两个浮点值的挤压

时间:2017-09-12 19:51:57

标签: python squish

我试图使用压扁比较2个值(浮点数),它有时可以正常工作,但几次失败。这是非常不一致的。有人可以帮助我如何使用isclose来比较浮动值。

以下是我的剧本:

 Xposition_set = waitForObject("{id='textBoxGoto_Sample_X'}").text
 Xposition_setValue = round(float(Xposition_set), 2)

 Xposition_displayed = waitForObject("{id='dbxX' nativeObject.DataContext.Name='" + str(positionList[Index])+ "'}").text
 Xposition_displayedValue = round(float(Xposition_displayed), 2)

 test.compare(Xposition_setValue, Xposition_displayedValue,  GetTestCaseNumber() + "X -Positions matches")

2 个答案:

答案 0 :(得分:0)

您正在尝试的应该是一般的,但由于缺少信息,您无法找到上述代码遇到的特定问题。

这是一个Squish测试脚本示例(对于Squish for Windows,您似乎使用它),它可以满足您对Squish Addressbook示例的要求:

import os
import math

def main():
    startApplication("%s/examples/win/addressbook/Addressbook" % os.getenv("SQUISH_PREFIX"))
    o = waitForObject("{type='Window'}")

    # Obtaining fake value 1:
    o.nativeObject.Text = "1.0"
    v1 = round(float(o.nativeObject.Text), 2)

    # Obtaining fake value 2:
    o.nativeObject.Text = "2.0"
    v2 = round(float(o.nativeObject.Text), 2)

    # Pass:
    test.verify(math.isclose(v1, v2, abs_tol=1))

    # Fail on purpose:
    test.verify(math.isclose(v1, v2, abs_tol=0.9))

请注意,由于math.isclose(),此测试脚本适用于Python 3.5.x,因此它不能使用默认的Squish二进制包,因为它们附带Python 2.7.x(联系Squish技术支持)获取具有不同Python版本的Squish二进制包。)

答案 1 :(得分:0)

查看documentation for math.isclose()

  

数学。 isclose a,b,*,rel_tol = 1e-09,abs_tol = 0.0
  如果值 a b 彼此接近,则返回True,否则返回False

另请注意:

  

版本3.5中的新内容。

因此,您应确保运行Python 3.5+以使用该功能。但话说回来,你需要做的就是传递你的价值观。浮点算术错误的标准示例通常是添加0.1 + 0.2

>>> 0.1 + 0.2
0.30000000000000004

因此,如果我们检查该计算是否等于0.3

>>> 0.1 + 0.2 == 0.3
False

使用新的math.isclose()功能,我们可以解决这个问题:

>>> import math
>>> math.isclose(0.1 + 0.2, 0.3)
True

在Python 3.5之前,您可以手动执行此操作。您只想检查两个数字之间的绝对差异是否非常小。 math.isclose()的默认容差为1e-09,因此我们可以使用:

>>> abs(0.1+0.2 - 0.3) < 1e-9
True

事实上,这两个花车之间的差异远远小于甚至:

>>> abs(0.1+0.2 - 0.3)
5.551115123125783e-17

因此,您可以使用更强的阈值,用于手动检查或使用math.isclose()并传入rel_tol的值。