论双打与平等

时间:2012-01-17 15:50:22

标签: java junit double

我的方法之一返回double。在将此方法作为jUnit的一部分进行测试时,我注意到以下奇怪之处:<​​/ p>

    String a = "someString";
    String b = "someDifferentString";

    double result = c.getScore(a, b, true);
    System.out.println(result); // prints 0.0

    assert (result > 0.0); // Test passes

所以..我问你,0.0怎么能超过0.0?为什么result > 0.0评估为true

3 个答案:

答案 0 :(得分:9)

assert是一个Java关键字。您需要assertTrue(result > 0.0)

答案 1 :(得分:7)

一般来说,比较双打是危险的,因为根据定义,浮点表示是不精确的。此外,在打印值时必须小心,因为与实际存储的表示形式相比,打印表示通常是四舍五入的。

那就是说@JBNizet钉了它 - 你正在编写Java断言,而不是JUnit测试!

答案 2 :(得分:7)

这是你的担心的浮点数学。 0.0可能不是绝对0.0,而是0.00000000000000009或者其他非常小的东西。为什么是这样?好的浮点数学在计算机中是离散的。但实际上浮点数学是连续的,因此我们在离散(数字)和连续(模拟)之间存在不匹配。错误开始蔓延,导致事情稍微漂移。如果你想了解更多,请阅读:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

junit中有一些方法专门用于比较允许公差的浮点数/双精度数(即assertEquals(双重预期,双重实际,双重epsilon))。使用这些,你应该面对你看到的微小错误稳定你的测试。请注意不要将它们设置得太高,因为您的整体错误应该非常小。

也可以看到这个问题:

JUnit assertEquals(double expected, double actual, double epsilon)