2012-08-04 32 views
4

assertEquals for doubles is deprecated。我发现应该使用Epsilon的格式。这是因为不可能100%严格的双打。但无论如何,我需要比较两个双打(预期和实际结果),但我不知道如何去做。如何在JUnit中断言两个双打在Epsilon中使用assertEquals?

目前我的测试看起来像:

@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*/;} 

回答

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了解更多信息。

+0

谢谢你,你的答案简单而有用。 – Dragon 2012-08-04 13:02:44

1

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

例如,对于110.42,0.01可能工作正常,但如果期望值> 2 则不起作用。由于精度(即只有52位尾数位),0.01的大小会很大以至于会丢失0.01。例如,2 + 0.01 == 2 。

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

需要注意的是,如果期望值为0.0,则该公式计算ε为0.0,这对于特定情况可能过于严格。

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

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

没有必要涉及epsilon或delta。