Java 如何使用带Epsilon的assertEquals在JUnit中断言两个double?
不推荐使用双精度的assertEquals。我发现应该使用带ε的形式。这是因为双打不可能100%严格。但无论如何,我需要比较两个双打(预期结果和实际结果),但我不知道怎么做 目前,我的测试结果如下: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
@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);
谢谢你,你的答案简单而有用。