Странное поведение десятичной дроби. Раунд - PullRequest
0 голосов
/ 11 сентября 2018

При использовании decimal почему поведение округления всегда одинаково?

Неважно, использую я MidpointRounding.AwayFromZero или нет, это всегда дает 1.04. В первом случае, не должен ли результат быть 1.03?

Console.WriteLine(decimal.Round(1.035m, 2));
Console.WriteLine(decimal.Round(1.035m, 2, MidpointRounding.AwayFromZero));

https://github.com/dotnet/corefx/blob/664d98b3dc83a56e1e6454591c585cc6a8e19b78/src/Common/src/CoreLib/System/Decimal.cs#L612

https://github.com/dotnet/corefx/blob/61d792e202d039c304c4f04ad816a57688f32fd4/src/Common/src/CoreLib/System/Decimal.DecCalc.cs#L2429-L2444

Ответы [ 5 ]

0 голосов
/ 11 сентября 2018

Разве округление по умолчанию не округляется в большую сторону?в этом случае 5 округляется и переносится ...

По умолчанию в методе округления используется округление до ближайшего соглашения.В следующей таблице перечислены перегрузки метода округления и соглашения о округлении, которое использует каждый из них.https://docs.microsoft.com/en-us/dotnet/api/system.math.round?view=netframework-4.7.2

0 голосов
/ 11 сентября 2018

Мне кажется, это ожидаемое поведение при округлении десятичной дроби.

Пример:

1.035 => 1.040 производят с двумя десятичными знаками 1.04

1,033 => 1,030 производим с двумя десятичными знаками 1,03

0 голосов
/ 11 сентября 2018

По умолчанию используется метод округления MidpointRounding.ToEven, поэтому при выборе округления до 1.03 или 1.04 выбирается метод с четным числом в конце, 1.04.

0 голосов
/ 11 сентября 2018

Как сказано в MSDN :

public static decimal Round(
    decimal d,
    int decimals
)

десятичные дроби: значение от 0 до 28, которое указывает количество десятичных разрядов для округления до.

Вы хотите округлить в 2 местах, он должен 1,04

0 голосов
/ 11 сентября 2018
нет

№:

Этот метод [Round(decimal d, int decimals)] эквивалентен вызову метода Round(Decimal, Int32, MidpointRounding) с аргументом режима MidpointRounding.ToEven.

Когда d находится точно посередине между двумя округленными значениями, результатом является округленное значение, которое имеет четную цифру в крайнем правом десятичном положении . Например, при округлении до двух десятичных дробей значение 2,345 становится 2,34, а значение 2,355 становится 2,36.

Таким образом, при округлении 1.035 до четного, оно становится 1.04, потому что 4 является четным, а 3 - нет.

...