Assert.AreEqual() が System.Double で非常に混乱しています 質問する

Assert.AreEqual() が System.Double で非常に混乱しています 質問する

説明

これは現実世界の例ではありません。decimalまたは他のものを使用することを提案しないでください。

なぜこのようなことが起こるのかを本当に知りたいので、これを質問しているだけです。

最近、素晴らしいTekpubウェブキャストを見ましたJon Skeet による C# 4.0 のマスターまた。

エピソード7 - 小数点と浮動小数点それは本当に奇妙になっていて、私たちのプログラミング界のチャック・ノリス(別名ジョン・スキート)私の質問に対する本当の答えはありません。かもしれない

質問: なぜMyTestMethod()不合格だったのにMyTestMethod2()合格したのですか?

例1

[Test]
public void MyTestMethod()
{
    double d = 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;

    Console.WriteLine("d = " + d);
    Assert.AreEqual(d, 1.0d);
}

d = 1

予想値: 0.999999999999999989d しかし実際は: 1.0d

例2

[Test]
public void MyTestMethod2()
{
    double d = 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;

    Console.WriteLine("d = " + d);
    Assert.AreEqual(d, 0.5d);
}

d = 0,5

しかし、なぜ ?

アップデート

なぜAssert.AreEqual()それをカバーしないのですか?

ベストアンサー1

Assert.AreEqual() するそれをカバーするには、3 番目の引数を持つオーバーロードを使用する必要がありますdelta

Assert.AreEqual(0.1 + 0.1 + 0.1, 0.3, 0.00000001);

おすすめ記事