描述

这不是真实的例子!请不要建议使用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/

10-09 15:43