C#NUnit单元测试不使用正确的方法返回比较

dfm*_*tro 5 c# unit-testing

我有以下课程

public static class MyClass
{
    public static double Converter(int mpg)
    {
       return Math.Round((double)mpg / ((double)36 / 12.74), 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

和NUnit单元测试

[TestFixture]
public class ConverterTests
{
    [Test]
    public void Basic_Tests()
        Assert.AreEqual(8.50, MyClass.Converter(24));
    }
}
Run Code Online (Sandbox Code Playgroud)

我的单元测试失败了

Expected: 8.5d
But was:  8.4900000000000002d
Run Code Online (Sandbox Code Playgroud)

当我调试方法返回8.49时,单元测试从哪里得到长数字,最后是2?

Jon*_*eet 2

单元测试显示的结果与我在执行代码时看到的结果相同。这是一个简短但完整的程序,用于显示使用我的类检索到的确切结果。DoubleConverter

using System;

class Test
{
    static void Main()
    {
        double x = Convert(24);
        Console.WriteLine(DoubleConverter.ToExactString(x));
    }

    static double Convert(int mpg)
    {
        return Math.Round((double) mpg / ((double) 36 / 12.74), 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

8.4900000000000002131628207280300557613372802734375
Run Code Online (Sandbox Code Playgroud)

使用计算器,我预计未四舍五入的结果为 8.4933333 - 当四舍五入到小数点后两位时,它确实会四舍五入到“大约 8.49”。

所以实际上,问题更多的是为什么你在调试器中看到 8.5,而不是单元测试失败的原因。我自己没有看到这一点,所以你可能想具体了解一下你是如何调试的。调试时,您可能会看到不同的结果,因为:

  • 在调试中,您可能会使用不同的浮点运算,例如“纯”64 位而不是 .NET 允许的 80 位中间运算
  • 您可能正在调试其他将处理器的浮点模式设置为 32 位的代码;我在使用 DirectX 时见过这种情况,但我希望您能够意识到您正在这样做
  • 调试器可能会以截断的形式显示结果,尽管我不希望它将该数字截断为 8.5