如何使用Epsilon的assertEquals在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*/;} 

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

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

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

有关更多信息,请参阅JUnit文档 。

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

例如,0.01可能适用于110.42但是如果预期值> 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和±∞。

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

不需要涉及epsilon或delta。