如何使用Epsilon的assertEquals在JUnit中断言两个双精度?

时间:2012-08-04 12:55:15

标签: java junit

不推荐使用双精度的assertEquals。我发现应该使用Epsilon的表格。这是因为不可能100%严格的双打。但无论如何我需要比较两个双打(预期和实际结果),但我不知道该怎么做。

目前我的测试结果如下:

@Test
public void testCalcPossibleDistancePercentageCount() {
    int percentage = 100;
    assertEquals("Wrong max possible value for %" + percentage, 110.42, processor.calcPossibleValue(percentage));
    percentage = 75;
    /*corresponding assertions*/
}

以下是我收到的3个双值,我想用JUnit检查:110.42,2760.5和10931.58。 JUnit测试应该如何使用断言?我通过方法计算得到它们:

processor.calcPossibleValue(allowed_percentage){return /*Some weird formulae here*/;}

4 个答案:

答案 0 :(得分:9)

您需要向assertEquals调用添加第四个参数:两个双精度应被视为“相等”的阈值。你的电话应该是这样的:

assertEquals("Wrong max possible value for %" + percentage, 110.42,
        processor.calcPossibleValue(percentage), 0.01);

上述调用表明如果processor.calcPossibleValue(percentage)返回的值在110.42的±0.01范围内,则认为这两个值相等。您可以更改此值,使其小到应用程序所需的值。

有关详细信息,请参阅JUnit documentation

答案 1 :(得分:1)

Java double使用IEEE 754 64-bit format。这种格式有52个尾数位。比较2个值时,epsilon应考虑预期值的大小。

例如,对于110.42,0.01可能正常工作,但如果期望值> 1,它将无法工作。 2 52 。 2 52 的幅度如此之大,以至于由于精度(即仅52位尾数位)将丢失0.01。例如,2 52 + 0.01 == 2 52

考虑到这一点,epsilon应该缩放到预期值。例如,预期值÷2 52-3 或110.42÷2 52-3 = 1.96 ... x 10 -13 。我选择2 52 - 3 ,因为这将给出尾数中3个最低有效位的容差。

一个警告是,如果期望值为0.0,则此公式将epsilon计算为0.0,对于特定情况可能过于严格。

另一个警告是不处理NaN和±∞。

答案 2 :(得分:0)

Assert.assertTrue("Not equals", expectedDouble -  actualDouble == 0);

无需涉及epsilon或delta。

答案 3 :(得分:0)

不推荐使用

assertTrue("message like not equal ",expectedresult-actual == 0);