При использовании decimal почему поведение округления всегда одинаково?
decimal
Неважно, использую я MidpointRounding.AwayFromZero или нет, это всегда дает 1.04. В первом случае, не должен ли результат быть 1.03?
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 округляется и переносится ...
По умолчанию в методе округления используется округление до ближайшего соглашения.В следующей таблице перечислены перегрузки метода округления и соглашения о округлении, которое использует каждый из них.https://docs.microsoft.com/en-us/dotnet/api/system.math.round?view=netframework-4.7.2
Мне кажется, это ожидаемое поведение при округлении десятичной дроби.
Пример:
1.035 => 1.040 производят с двумя десятичными знаками 1.04
1,033 => 1,030 производим с двумя десятичными знаками 1,03
По умолчанию используется метод округления MidpointRounding.ToEven, поэтому при выборе округления до 1.03 или 1.04 выбирается метод с четным числом в конце, 1.04.
MidpointRounding.ToEven
Как сказано в MSDN :
public static decimal Round( decimal d, int decimals )
десятичные дроби: значение от 0 до 28, которое указывает количество десятичных разрядов для округления до.
Вы хотите округлить в 2 местах, он должен 1,04
№:
Этот метод [Round(decimal d, int decimals)] эквивалентен вызову метода Round(Decimal, Int32, MidpointRounding) с аргументом режима MidpointRounding.ToEven. Когда d находится точно посередине между двумя округленными значениями, результатом является округленное значение, которое имеет четную цифру в крайнем правом десятичном положении . Например, при округлении до двух десятичных дробей значение 2,345 становится 2,34, а значение 2,355 становится 2,36.
Этот метод [Round(decimal d, int decimals)] эквивалентен вызову метода Round(Decimal, Int32, MidpointRounding) с аргументом режима MidpointRounding.ToEven.
Round(decimal d, int decimals)
Round(Decimal, Int32, MidpointRounding)
Когда d находится точно посередине между двумя округленными значениями, результатом является округленное значение, которое имеет четную цифру в крайнем правом десятичном положении . Например, при округлении до двух десятичных дробей значение 2,345 становится 2,34, а значение 2,355 становится 2,36.
Таким образом, при округлении 1.035 до четного, оно становится 1.04, потому что 4 является четным, а 3 - нет.
1.035