функция раунда в c # - PullRequest
       37

функция раунда в c #

1 голос
/ 06 октября 2011
   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 ]

4 голосов
/ 06 октября 2011

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

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

1 голос
/ 06 октября 2011

Как вы сказали,

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

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

0 голосов
/ 06 октября 2011

Округление по умолчанию - 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).

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

...