论双打与平等

Jam*_*sev 3 java double junit

我有一种方法返回一个double.当测试这个方法作为我的一部分时jUnit,我注意到以下奇怪之处:

    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
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 9

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


Ern*_*ill 7

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

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


chu*_*ubs 7

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

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

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

关于它也可以看到这个问题:

JUnit assertEquals(双重预期,双重实际,双重epsilon)