В С# Есть ли разница в точности двух стратегий округления десятичных чисел MidpointRounding.ToEven
и MidpointRounding.AwayFromZero
? Я имею в виду, что обе обеспечивают равномерное распределение среди чисел, округленных до или одну стратегию округления, для представления округленных чисел по сравнению с другими?
С# округление MidpointRounding.ToEven против MidpointRounding.AwayFromZero
Ответ 1
Из 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