Некоторое время назад я создал тестовую программу для последовательного округления, потому что это в основном стресс-тест в худшем случае для алгоритма округления.
Для каждого числа от 0 до 9 999 оно сначала округляется до ближайших 10, затем до ближайших 100, затем до ближайшей 1000. (Вы также можете думать об этом как о 10000 точек в [0,1), округленных до 3 мест, затем до 2, затем до 1.) Этот набор чисел имеет среднее значение 4999,5.
Если все три закруглений выполнены с использованием методы «круглый половина вверх», то результаты выглядят следующим образом (первый столбец округление результата, второй столбец как много чисел с округлением до этого результата - т.е. это гистограмма).
0 445
1000 1000
2000 1000
3000 1000
4000 1000
5000 1000
6000 1000
7000 1000
8000 1000
9000 1000
10000 555
Результат отличается от одной «округленной половины» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение составляет 5055 (выше исходного среднего на 55,5).
Если все три округления выполняются с помощью «округления до половины», то получаются следующие результаты:
0 556
1000 1000
2000 1000
3000 1000
4000 1000
5000 1000
6000 1000
7000 1000
8000 1000
9000 1000
10000 444
Результат отличается от одной «округленной половины вниз» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение составляет 4944 (слишком мало для 55,5).
Если все три округления выполнены с использованием «округлой половины нечетной», результат будет следующим:
0 445
1000 1111
2000 889
3000 1111
4000 889
5000 1111
6000 889
7000 1111
8000 889
9000 1111
10000 444
Результат отличается от одной «округлой половины нечетного» до ближайшей тысячи 550 раз из 10000, а среднее округленное значение равно 4999,5 (правильно).
Наконец, если все три округления выполняются с использованием «округления до половины», получаются следующие результаты:
0 546
1000 909
2000 1091
3000 909
4000 1091
5000 909
6000 1091
7000 909
8000 1091
9000 909
10000 1091
Результат отличается от одной «округленной половины» до ближайшей тысячи в 450 раз из 10000, а среднее округленное значение равно 4999,5 (правильно).
Я думаю, что очевидно, что округление наполовину вверх и округление наполовину вниз смещает округленные значения, так что среднее значение округленных значений больше не соответствует ожидаемым средним значениям исходных значений, и что «округление наполовину четное» и «округление наполовину нечетное» «Устранить смещение, обрабатывая 5 в одну сторону, а другую половину - в другую. Последовательное округление умножает смещение.
Круглая половина четная и круглая половина нечетная вносят свой собственный характер смещения в распределение: смещение в сторону четных и нечетных цифр соответственно. В обоих случаях, опять же, это смещение умножается на последовательное округление, но оно хуже для половины нечетного раунда. Я думаю, что объяснение в этом случае простое: 5 - нечетное число, поэтому половина нечетного раунда имеет больше результатов, заканчивающихся на 5, чем четная половина раунда - и, следовательно, больше результатов, которые должны будут обрабатываться специально при следующем округлении.
Так или иначе, из четырех вариантов, только два являются беспристрастными, а из двух несмещенных вариантов круглая половина даже дает наилучшее распределение при условии повторного округления.