説明
これは現実世界の例ではありません。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);