【发布时间】:2014-08-21 17:28:50
【问题描述】:
我偶然发现我的代码中的一个方法在我的代码中计算了一个四舍五入的值错误。 我知道比较双精度值会产生意外结果的问题。
例子
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 是完全清楚的。然而,事实并非如此。 谁能解释一下原因?
【问题讨论】:
-
结果4真的输出4.72吗?
-
结果 4 显示 4.73。顺其自然,但 double 听起来有点奇怪。
-
拉吉,绝对不是。实际上,这正是您所期望的。
-
抱歉,复制粘贴 ;) 结果 4 是 4.73,如预期的那样