assertEquals精度

时间:2016-02-13 08:57:20

标签: java junit precision assert

我对assertEquals中的增量/精度感到困惑。 我知道0.034会给我分区代码的精确度,如下所示:

public void testDivide() {
        assertEquals(3.0, Arithmetic.divide(12.0, 4.0), 0.0);
        assertEquals(3.3, Arithmetic.divide(10.0, 3.0), 0.034);

        //fail("Not yet implemented");
    }

但是,我尝试将其更改为0.03,测试失败。另一方面,当我将其更改为0.04时,它成功了,或者即使我将其更改为0.034444等等,它也会成功。 我可以知道数字是什么意思,我们如何使用它?

2 个答案:

答案 0 :(得分:7)

您正在使用:

assertEquals (double expected, double actual, double epsilon)

由于任何语言中的doubles may not be exactly equal(精度问题),epsilon允许您描述它们的接近程度。

Epsilon 定义是与expected结果的最大偏差:

Math.abs(expected - actual) < epsilon

所以从本质上讲,它允许你偏离expected结果(在你的情况下3.03.3Arithmetic.divide(12.0, 4.0) - 3.0 = 3.0 - 3.0 = 0
 分别为Arithmetic.divide(10.0, 3.0) - 3.3 ≈ 3.3333333 -3.3 ≈ 0.3333333

所以在你看到的第一个中,实际上不需要epsilon,因为expectedactual结果完全相同。 在第二个中,您应该允许一些偏差,因为actual结果>大约0.33333 expected而不是Gemfile

答案 1 :(得分:2)

根据:http://junit.sourceforge.net/javadoc/org/junit/Assert.html#assertEquals(double,双倍,双倍)

**delta** - the maximum delta between expected and actual for which both numbers are still considered equal.

表示delta = 0.3 现在,Arithmetic.divide(10.0,3.0) - 3.0 = 0.333..greater than 0.3,因此assertEqual()失败

表示delta = 0.4 现在,Arithmetic.divide(10.0,3.0) - 3.0 = 0.333..LESSER than 0.4,因此assertEqual()已通过