Java 如何使用带Epsilon的assertEquals在JUnit中断言两个double?

Java 如何使用带Epsilon的assertEquals在JUnit中断言两个double?,java,junit,Java,Junit,不推荐使用双精度的assertEquals。我发现应该使用带ε的形式。这是因为双打不可能100%严格。但无论如何,我需要比较两个双打(预期结果和实际结果),但我不知道怎么做 目前,我的测试结果如下: @Test public void testCalcPossibleDistancePercentageCount() { int percentage = 100; assertEquals("Wrong max possible value for %" + percentage

不推荐使用双精度的assertEquals。我发现应该使用带ε的形式。这是因为双打不可能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
调用中添加第四个参数:两个double应被视为“相等”的阈值。您的呼叫应如下所示:

assertEquals("Wrong max possible value for %" + percentage, 110.42,
        processor.calcPossibleValue(percentage), 0.01);
上述调用表明,如果
处理器.calcPossibleValue(percentage)
返回的值在
110.42
的±0.01范围内,则认为这两个值相等。您可以更改此值,使其尽可能小,以满足应用程序的需要

有关更多信息,请参阅。

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

例如,对于110.42,0.01可以正常工作,但是如果预期值大于252,则它将不工作。252的大小如此之大,以至于0.01将由于精度而丢失(即仅52位尾数位)。例如,252+0.01==252

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

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

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

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

不需要涉及epsilon或delta。

不推荐使用Assert

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

谢谢你,你的答案简单而有用。