web-dev-qa-db-ja.com

assertEquals(double、double)がJUnitで非推奨になったのはなぜですか?

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()はdouble値を返します。

何が間違っているのでしょうか?

55
jsh6303

Doubleの精度の問題のため、非推奨です。

注意してください、delta精度の損失を許可する別のメソッドassertEquals(double expected, double actual, double delta)があります。

JavaDoc

正のデルタ内で2つのdoubleが等しいことをアサートします。そうでない場合、AssertionErrorがスローされます。期待値が無限大の場合、デルタ値は無視されます。NaNは等しいと見なされます。assertEquals(Double.NaN, Double.NaN, *)が渡されます

...

delta-両方の数値がまだ等しいと見なされる、期待される値と実際の値の間の最大の差。

74
Codebender

assertEquals(double, double)は2つのdoubleが同じである可能性があるため非推奨ですが、それらが計算値である場合、プロセッサーはそれらをわずかに異なる値にする場合があります。

これを試みると失敗します:assertEquals(.1 + .7, .8)これは、Intel®プロセッサーを使用してテストされました

非推奨のメソッド を呼び出すと、fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");が呼び出されます。

14
Eric

人々は説明しますが、サンプルを提供しません...だからここに私のために働いたものがあります:

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

最後の0;

13
Victor Augusto

古い質問ですが、これはまだ言われておらず、誰かを助けるかもしれません。

com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance)を使用すると、2つのdoubleが互いにどれだけ近いかを指定できます。

小数点以下の桁数が多いテスト結果値をハードコードしたくない単体テストには非常に便利です。

0
steven35