Как Python округляет числа?

Я создаю финансовый веб-сайт с помощью Flask framework и сейчас пишу для него модульные тесты. Я использую пакет Babel для форматировать денежные суммы, и я столкнулся с довольно странным поведением округления. Я ожидаю, что округление будет в большую сторону в случае 5 или, по крайней мере, будет последовательным. Но посмотрите на это:

>>> from decimal import Decimal
>>> from babel.numbers import format_currency
>>> print format_currency(Decimal('.235'), 'EUR', locale='nl_NL')
€ 0,24
>>> print format_currency(Decimal('.245'), 'EUR', locale='nl_NL')
€ 0,24

Почему это так, и что более важно; как я могу это решить?

PS: я бы предпочел округлить .245 до .25

[РЕДАКТИРОВАТЬ]

Я искал источник, который ссылается на некоторые другие фрагменты кода. Но я не могу понять, что там не так и почему кажется, что оно случайным образом округляется вверх или вниз. Кто-нибудь знает?


person kramer65    schedule 11.02.2015    source источник
comment
Похоже на округление банкиров: en.wikipedia.org/wiki/Rounding#Round_half_to_even   -  person FatalError    schedule 11.02.2015


Ответы (1)


Если вы проследите код до apply, вы увидите ссылку на процедуру bankersround, которая сообщает нам то, что нам нужно знать. Babel использует метод округления банка, который округляет до ближайшего четного числа на 5. Таким образом, 0,245 и 0,235 округляются до 0,24, поскольку 0,24 является ближайшим четным значением для каждого из них. Значения выше и ниже 5 округляются нормально.

person paidhima    schedule 11.02.2015