我的方法之一返回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
?
答案 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)