描述
这不是真实的例子!请不要建议使用decimal
或其他方式。
我之所以只问这个,是因为我真的很想知道为什么会这样。
最近,我再次通过Jon Skeet 看到了很棒的Tekpub网络广播 Mastering C#4.0。
在第7集-小数和浮点上,这真的很奇怪,甚至我们的
编程的Chuck Norris(又名Jon Skeet)对我的问题没有真正的答案。
可能只有一个。
问题:为什么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);
}
这导致
例子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);
}
这导致成功
但为什么 ?
更新Assert.AreEqual()
为什么不覆盖呢?
最佳答案
好的,我还没有检查Assert.AreEqual
的功能...但是我怀疑默认情况下它没有施加任何公差。我不希望它落伍。因此,让我们寻找另一种解释...
您基本上看到了一个巧合-四次加法后的答案恰好是确切值,可能是因为幅度变化时最低位丢失了某个地方-我没有查看所涉及的位模式,但是如果使用DoubleConverter.ToExactString
(我自己的代码),您可以随时确切地看到该值是什么:
using System;
public class Test
{
public static void Main()
{
double d = 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
}
}
结果(在我的盒子上):
d = 0.1000000000000000055511151231257827021181583404541015625
d = 0.200000000000000011102230246251565404236316680908203125
d = 0.3000000000000000444089209850062616169452667236328125
d = 0.40000000000000002220446049250313080847263336181640625
d = 0.5
现在,如果您以不同的数字开头,则无法以相同的方式进行计算:
(从d = 10.1开始)
d = 10.0999999999999996447286321199499070644378662109375
d = 10.199999999999999289457264239899814128875732421875
d = 10.2999999999999989341858963598497211933135986328125
d = 10.39999999999999857891452847979962825775146484375
d = 10.4999999999999982236431605997495353221893310546875
因此,基本上,您的测试碰巧遇到了幸运或不幸–错误消除了自己。
关于c# - Assert.AreEqual()与System.Double的确令人困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8825956/