2012-01-17 122 views
3

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

所以..我问你,0.0怎么会那么多0.0≦为什么result > 0.0评估为true

+0

我认为你可以找到这个主题的答案: http://stackoverflow.com/questions/285680/representing-monetary -values-in-java – Jako 2012-01-17 15:54:21

回答

9

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

+0

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html根据这个文档,断言表达式是有效的,这是由OP完成的权利?我错过了什么吗? – kosa 2012-01-17 15:55:46

+0

非常漂亮!谢谢 – JAM 2012-01-17 15:55:52

+0

好的。我在想这可能是一些浮点精度问题。 +1。 – 2012-01-17 15:58:06

7

比较双打一般是危险的,因为根据定义,浮点表示是不精确的。此外,打印数据时必须小心,因为打印后的图像通常会与实际存储的图像相比较。

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

7

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

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

有在JUnit方法专门用于比较花车/双打是允许的公差(即的assertEquals(双预期,双实双小量))设计的。使用这些,你应该稳定你的测试面对你所看到的微小错误。请注意不要将它们设置得太高,因为您的整体错误应该很小。

见它还有这样一个问题:

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