This is actually very interesting, since normally, the round to nearest will round 74675.055 to 74675.06, but in this case it goes the other way...
I broke the calculation into steps and printed the result at each step:
double foo = 1493501.1;
Console.WriteLine(foo.ToString("R"));
foo *= 5;
Console.WriteLine(foo.ToString("R"));
foo /= 100;
Console.WriteLine(foo.ToString("R"));
foo *= 100;
Console.WriteLine(foo.ToString("R"));
foo /= 100;
Console.WriteLine(foo.ToString("R"));
foo = Math.Round(foo, 2);
Console.WriteLine(foo.ToString("R"));
I used the "R" round-trip format to get the most information from the output.
The result was:
1493501.1
7467505.5
74675.055
7467505.4999999991
74675.055
74675.05
After the
foo *= 100;
step you can see that the value is
slightly less than 7467505.5, so I believe that it remains ever so slightly below the value displayed (not enough to change what is displayed, but enough to change what is calculated by Math.Round).
Converting from
double
to
decimal
gives exactly the result you expect.