Если Вы волнуетесь по поводу удобочитаемости своего кода, добавьте комментарий для напоминания себе, какой и почему Вы делаете это.
На самом деле вы не в середине. 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);
}
Округляется до 99,96, только если вы находитесь в самой средней точке, то есть 99,965:
C:\temp>ipy IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927 Type "help", "copyright", "credits" or "license" for more information. >>> import clr >>> from System import Math, MidpointRounding >>> Math.Round(99.9651, 2, MidpointRounding.ToEven) 99.97 >>> Math.Round(99.965, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.9649, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.975, 2, MidpointRounding.ToEven) 99.98 >>>
Значение MidpointRounding
вступает в игру только тогда, когда вы пытаетесь округлить значение, у которого младшая цифра ровно 5. Другими словами, значение должно быть 99,965
, чтобы получить желаемый результат. Поскольку здесь это не так, вы просто наблюдаете стандартный механизм округления. Дополнительную информацию см. На странице MSDN .
Вот результаты, которые проливают свет на эту тему:
Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven); // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96
Средняя точка точно равна 5 ... не 535789, не 499999.
Math.Round 'Округляет десятичное значение до указанного числа дробных знаков.' при округлении 99,96500000,2 округляется до 99,96 и 99,96500001 до 99,67. Округляет полное значение.
Округление средней точки рассматривается только в том случае, если значение находится между двумя вашими случаями.
В вашем случае это не «5», а «535 ...», поэтому оно больше средней точки, а процедуры - 0,96. Чтобы добиться ожидаемого поведения, необходимо выполнить усечение до третьей десятичной точки, ЗАТЕМ округлить с помощью MidpointRounding.ToEven.