不推荐使用双精度的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*/;}
答案 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);