我在 xUnit 中有以下测试用例。
Assert.NotEqual(0f, 0.1f + 0.2f - 0.3f);
Assert.NotEqual(0d, 0.1d + 0.2d - 0.3d);
Assert.Equal(0m, 0.1m + 0.2m - 0.3m);
多年来,他们在 .NET 4 或 4.5 上的 VS 2010、2012、2013 和 2015 中一直运行良好。结果与 MS 测试相同。测试用例是为了证明 float 计算可能不够精确。因为 0.1+0.2 预计为 0.30000000000000004。
然而,今天,我发现第一种情况被打破了,显然.NET运行时和编译器认为0.1f+0.2f==0.3f。我不确定这是否与我几天前升级到 VS 2015 Update 2 有关。然后我在 VS 2012 Update 4 中尝试相同的测试,第一个测试用例没问题。我怀疑 VS 2015 更新 2 的 .NET 编译器已损坏或正在使浮点计算更准确。只要由 VS 2015 update 2 编译,.NET 4、4.5 和 4.6.1 的结果是一致的。我不完全确定这是 VS 2015 update 2 的错误,还是好事?你有什么想法吗?
最佳答案
感谢乔恩、汉斯和霍根。同意这可能是编译器问题,因为我在 20 多年前编写了一个编译器。我已经按照建议在 https://github.com/dotnet/roslyn/issues/11311 报告了这个问题。使用以下测试用例。
[TestMethod]
public void TestFloatConst()
{
Assert.AreNotEqual(0f, 0.1f + 0.2f - 0.3f);//Broken in VS 2015 Update 2
}
[TestMethod]
public void TestFloatConstComparison()
{
Assert.AreNotEqual(0.3f, 0.1f + 0.2f);//Broken in VS 2015 Update 2
}
[TestMethod]
public void TestDoubleConst()
{
Assert.AreNotEqual(0d, 0.1d + 0.2d - 0.3d);
}
[TestMethod]
public void TestDoubleConstComparison()
{
Assert.AreNotEqual(0.3d, 0.1d + 0.2d);
}
[TestMethod]
public void TestDecimalConst()
{
Assert.AreEqual(0m, 0.1m + 0.2m - 0.3m);
}
[TestMethod]
public void TestFloatVariable()
{
var a = 0.1f;
var b = 0.2f;
var c = 0.3f;
Assert.AreNotEqual(0f, a+b-c);//OK in both debug and release builds
}
关于c# - Visual Studio 2015 Update 2 让浮点计算更准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37226563/