I’m building a financial website with the Flask framework and I’m currently writing unit tests for it. I’m using the Babel package to format money amounts and I hit upon rather strange rounding behaviour. I would expect rounding to be up in case of a
5, or to at least be consistent. But look at this:
>>> 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
Why is this so, and more importantly; how can I solve this?
ps: I would prefer
.245 to be rounded up to
If you follow the code through to
apply you can see a reference to a
bankersround procedure, which tells us what we need to know. Babel is using the bankers round method of rounding, which rounds to the nearest even number on 5. So, .245 and .235 round to .24 as .24 is the closest even value for each. Values above and below 5 round normally.