Вы на самом деле не в средней точке. MidpointRounding.ToEven
означает, что если бы у вас было число 99,965 , т.е. 99,96500000 [и т. Д.], , тогда вы получите 99,96. Поскольку число, которое вы передаете в Math.Round выше этой средней точки, оно округляется в большую сторону.
Если вы хотите, чтобы ваш номер округлился до 99,96, сделайте следующее:
// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);
И, эй, вот небольшая удобная функция для выполнения вышеперечисленного в общих случаях:
// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
double multiplier = Math.Pow(10.0, digits + 1);
double truncated = Math.Truncate(value * multiplier) / multiplier;
return Math.Round(truncated, digits, mode);
}