我在我的代码中偶然发现了一个方法,其中我的代码中的舍入值计算错误。我知道比较双值会产生意外结果的问题。
例子
double x = 19.08;
double y = 2.01;
double result = 21.09;
if (x + y == result)
{
// this is never reached
}
此处说明:http: //csharpindepth.com/Articles/General/FloatingPoint.aspx
但是,直到现在,我希望 Math.Round() 方法即使使用双精度值也是准确的。
看看这段代码。
var decimals = 2;
var value1 = 4.725;
var value2 = 4.725M;
var result1 = Math.Round(value1, decimals, MidpointRounding.ToEven);
var result2 = Math.Round(value1, decimals, MidpointRounding.AwayFromZero);
var result3 = Math.Round(value2, decimals, MidpointRounding.ToEven);
var result4 = Math.Round(value2, decimals, MidpointRounding.AwayFromZero);
Console.WriteLine("Double (ToEven): {0}", result1); // outputs 4.72
Console.WriteLine("Double (AwayFromZero): {0}", result2); // outputs 4.72 (expected: 4.73)
Console.WriteLine("Decimal (ToEven): {0}", result3); // outputs 4.72
Console.WriteLine("Decimal (AwayFromZero): {0}", result4); // outputs 4.73
对我来说,result2 应该是 4.73 是完全清楚的。然而,事实并非如此。有人可以解释为什么吗?