繁体   English   中英

如何使用Epsilon的assertEquals在JUnit中断言两个双精度?

[英]How to Assert Two doubles in JUnit Using assertEquals with Epsilon?

不推荐使用双精度的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 ...×10 -13。 我选择了2 52 - 3,因为这将给出尾数中3个最低有效位的容差。

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

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

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

不需要涉及epsilon或delta。

断言是不推荐的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM