C # Округление MidpointRounding.ToEven против MidpointRounding.AwayFromZero - PullRequest
15 голосов
/ 09 сентября 2011

В C # Есть ли разница в точности двух стратегий десятичного округления MidpointRounding.ToEven и MidpointRounding.AwayFromZero? Я имею в виду, обеспечивают ли оба равномерное распределение между числами, которые округляются до, или одна стратегия округления больше, чем представление округленных чисел, по сравнению с другими?

Ответы [ 2 ]

34 голосов
/ 09 сентября 2011

Из MSDN:

По умолчанию Math.Round использует MidpointRounding.ToEven.Большинство людей не знакомы с «округлением до четности» как альтернативой, «округление от нуля» чаще всего преподается в школе.По умолчанию .NET имеет значение «Округление до четности», поскольку оно статистически лучше, поскольку оно не разделяет тенденцию «округления от нуля» к округлению немного чаще, чем округление вниз (при условии, что округляемые числа имеют тенденцию быть положительными.)

В зависимости от набора данных симметричное арифметическое округление может привести к значительному смещению, поскольку оно всегда округляет значения средней точки вверх.Чтобы взять простой пример, предположим, что мы хотим определить среднее из трех значений, 1,5, 2,5 и 3,5, но мы хотим сначала округлить их до ближайшего целого числа, прежде чем вычислять их среднее.Обратите внимание, что истинное среднее значение этих значений составляет 2,5.При использовании симметрического арифметического округления эти значения изменяются на 2, 3 и 4, а их среднее значение составляет 3. При использовании округления банкиров эти значения изменяются на 2, 2 и 4, а их среднее значение составляет 2,67.Поскольку последний метод округления намного ближе к истинному среднему значению трех значений, он обеспечивает наименьшую потерю данных.

http://msdn.microsoft.com/en-us/library/system.math.round.aspx

3 голосов
/ 27 февраля 2019

Если ваше значение 123,45 , тогда

123,5 <- MidpointRounding.AwayFromZero <br> 123,4 <- MidpointRounding.ToEven </p>

...