我有以下类(class)
public static class MyClass
{
public static double Converter(int mpg)
{
return Math.Round((double)mpg / ((double)36 / 12.74), 2);
}
}
和NUnit单元测试
[TestFixture]
public class ConverterTests
{
[Test]
public void Basic_Tests()
Assert.AreEqual(8.50, MyClass.Converter(24));
}
}
我的单元测试失败了
Expected: 8.5d
But was: 8.4900000000000002d
当我调试方法返回 8.49 时,单元测试从哪里获取最后带有 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);
}
}
结果:
8.4900000000000002131628207280300557613372802734375
使用计算器,我预计未四舍五入的结果为 8.4933333 - 当四舍五入到小数点后两位时,它确实会四舍五入为“大约 8.49”。
实际上,问题更多的是为什么您在调试器中看到 8.5 而不是单元测试失败的原因。我自己没有看到,所以你可能想看看你是如何调试的。调试时,您可能会看到不同的结果,因为:
- 在调试中,您可能会使用不同的浮点运算,例如“纯”64 位而不是 .NET 允许的 80 位中间操作
- 您可能正在调试将处理器的浮点模式设置为 32 位的其他代码;我在使用 DirectX 时看到过这种情况,但我希望您意识到自己正在这样做
- 调试器可能以截断的形式显示结果,尽管我不希望它将该数字截断为 8.5
关于C# NUnit 单元测试未使用正确的方法返回以进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32222698/