http://en.wikipedia.org/wiki/Rounding#Round_half_to_even
Round half to even
A tie-breaking rule that is less biased is round half to even, namely:
If the fraction of y is 0.5, then q is the even integer nearest to y.
Thus, for example, +23.5 becomes +24, as does +24.5; while −23.5
becomes −24, as does −24.5.
This method treats positive and negative values symmetrically, and is
therefore free of sign bias. More importantly, for reasonable
distributions of y values, the expected (average) value of the rounded
numbers is the same as that of the original numbers. However, this
rule will introduce a towards-zero bias for even numbers, and a
towards-infinity bias for odd ones.
This variant of the round-to-nearest method is also called unbiased
rounding, convergent rounding, statistician's rounding, Dutch
rounding, Gaussian rounding, odd-even rounding or bankers'
rounding, and is widely used in bookkeeping.
This is the default rounding mode used in IEEE 754 computing functions
and operators.
>>> "%.2f"%20.325
'20.32'
>>> "%.2f"%20.335
'20.34'
>>> "%.2f"%20.345
'20.34'
>>> "%.2f"%20.355
'20.36'
So the real question should be why does the third case fail?
203.25
can be expressed exactly in the floating point representation, however 0.1
cannot, it turns out to be a tiny bit more than 0.1
>>> 0.1*203.25
20.325000000000003
So it gets rounded up