Функция раунда в C#

   public static decimal Round(
decimal d,
int decimals
    )

Параметр decimals указывает число дробных цифр в возвращаемом значении и находится в диапазоне от 0 до 28. Если десятичное число равно нулю, возвращается целое число.

Если значение первой цифры в d справа от десятичной позиции десятичных дробей равно 5, цифра в десятичной позиции округляется в большую сторону, если она нечетная, или остается неизменной, если она четная. Если точность d меньше десятичной, возвращается d без изменений.

    Math.Round(3.44, 1); //Returns 3.4.
   Math.Round(3.45, 1); //Returns 3.4.

Почему 3.45 возвращается 3.4.. Я не могу понять этот вывод. Может кто-нибудь помочь

3 ответа

Вы можете изменить это поведение, используя перегрузку Round, которая принимает параметр MidpointRounding из MSDN:

ToEven (по умолчанию, AKA Bankers Rounding) Когда число находится посередине между двумя другими, оно округляется до ближайшего четного числа.
AwayFromZero Когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое отличается от нуля.

Как ты говорил,

Если значение первой цифры в d справа от десятичной позиции десятичных дробей равно 5, цифра в десятичной позиции округляется в большую сторону, если она нечетная, или остается неизменной, если она четная.

В 3.45 первая цифра справа от десятичной запятой равна 5, а поскольку 4 четна, она остается неизменной. Это довольно стандартный способ округления, потому что, если 5 всегда округляется, это может взвешивать такие вещи, как средние значения и суммы выше, чем они должны быть.

Округление по умолчанию MidpointRounding.ToEven (округление банкира), что означает, что оно будет стремиться к четному числу для цифры в месте округления (т. е. оно переместится в 3,4, потому что 4 является четным).

Это предназначено для минимизации накопления ошибок, которые могут возникнуть, когда все округления средней точки идут в одном и том же направлении (хотя это, конечно, зависит от ваших входных данных - одинаковое сочетание положительных и отрицательных чисел может подойти AwayFromZero).

Так что у тебя есть:

Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4 (down towards 4).
Math.Round(3.54, 1); //Returns 3.5.
Math.Round(3.55, 1); //Returns 3.6 (up towards 6).

Смотрите этот ответ для подробного объяснения всех доступных вам вариантов.

Другие вопросы по тегам