Ошибка округления в Python с нечетным числом?

Я начинаю на Python, и у меня есть один вопрос.
Почему округление числа, такого как 5.5, 7.5, (ничего).5 с нечетной целой частью, применяющей round(num), работает правильно (правило 5/4), но округленное число вроде (ничего).5 с нечетной целой частью тем же функция возвращает только целочисленную часть? (Но если мы добавим небольшое число, например, 0,000000001 в это десятичное число, оно работает правильно)

Я имею в виду следующее:

round(9.5)

возвращает 10, и это правильно. Но

round(8.5)

возвращает 8, и это неверно. И

round(8.5 + 0.0000000000001)

возвращает 9.

Почему это работает неправильно?
Я использую Python 3.2.2 в Windows.

Ответы

Ответ 1

Python 3.x, в отличие от Python 2.x, использует округление Banker для функции round().

Это документированное поведение:

[I] f два кратных одинаково близки, округление выполняется по отношению к четному выбору (так, например, как раунд (0,5), так и круглый (-0,5) равны 0, а раунд (1.5) равен 2).

Поскольку числа с плавающей запятой по самой своей природе являются только приближениями, не должно быть слишком важно, как обрабатываются "точные" полуцелые числа - в любом случае всегда могут быть ошибки округления в предыдущих вычислениях.

Изменить. Чтобы получить старое поведение округления, вы можете использовать

def my_round(x):
    return int(x + math.copysign(0.5, x))