![](/img/trans.png)
[英]How to call assertEquals with Double Epsilon/Precision in Kotlin?
[英]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.