コード内で、丸められた値が間違って計算されるメソッドを偶然見つけました。double 値を比較すると予期しない結果が生成されるという問題について認識しています。
例
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() メソッドは double 値でも正確であると思っていました。
このコードを見てください。
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 であることは明らかです。しかし、そうではありません。誰かが理由を説明できますか?