ChatGPT解决这个技术问题 Extra ChatGPT

为什么在 JUnit 中不推荐使用 assertEquals(double,double)?

我想知道为什么不推荐使用 assertEquals(double, double)

我使用了 import static org.junit.Assert.assertEquals; 并使用了 JUnit 4.11。

下面是我的代码:

import org.junit.Test;
import static org.junit.Assert.assertEquals;


public class AccountTest {

@Test
public void test() {
    Account checking = new Account(Account.CHECKING);
    checking.deposit(1000.0);
    checking.withdraw(100.0);
    assertEquals(900.0, checking.getBalance());
   }
}

checking.getBalance() 返回一个双精度值。

有什么问题?

如果您只是阅读 javadoc,您会被告知使用什么来代替。
尝试像 Assert.assertEquals(2.49, 2.49, 0.1); 一样使用它
如果我是 JUnit,我将无法通过使用 double 来表示货币金额而不是某些第三方库类或专门用于货币的自定义类的测试。

C
Community

由于双精度问题,它已被弃用。

如果您注意到,还有另一种方法 assertEquals(double expected, double actual, double delta),它允许 delta 精度损失。

JavaDoc

断言两个双精度数在正增量内相等。如果不是,则抛出 AssertionError。如果期望值为无穷大,则忽略 delta 值。NaN 被视为相等: assertEquals(Double.NaN, Double.NaN, *) 通过 ... delta - 仍考虑两个数字的预期和实际之间的最大 delta平等的。


@JiajuShen,这取决于您的计算...假设如果您执行 5.1 + 0.1,您会期望 5.2,但输出将是 5.1999...。所以 delta 可以是 0.0001... 甚至更小...
从 JUnit 源代码中查看此 example 或此 example
V
Victor Augusto

人们解释但不提供样品......所以这对我有用:

@Test
public void WhenMakingDepositAccountBalanceIncreases() {
    Account account = new Account();
    account.makeDeposit(10.0);
    assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0);
}

最后的0


使用 0.0 作为增量与使用不推荐使用的方法相同。增量旨在反映数字可以有多接近并且仍然被认为是相等的。使用 0.1 或 0.01 或 0.001 等值,具体取决于应用程序可以容忍多少错误。
这是一个不好的建议。使用 0 完全违背了使用未弃用方法的目的。这与使用不推荐使用的变体完全相同。这更加危险,因为您不再收到警告。确认它被弃用的原因并使用像 0.00001 这样的小增量。
E
Eric

assertEquals(double, double) 已弃用,因为 2 个双精度值可能相同,但如果它们是计算值,处理器可能会使它们的值略有不同。

如果您尝试此操作,它将失败:assertEquals(.1 + .7, .8)这是使用英特尔® 处理器测试的

调用 deprecated method 将触发调用 fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");


s
steven35

老问题,但这还没有说出来,可能会对某人有所帮助。

您可以使用 com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance),它允许您指定两个双打应该彼此接近的程度。

我发现它对于单元测试非常方便,我不想用很多小数位硬编码测试结果值。