The comparison table is what makes this land — a 55 versus 50 total across the same ten midpoints shows the drift in one glance, rather than just asserting that half-up is biased. The Decimal tip about passing values as strings is the detail most people miss; converting a float first just bakes the binary representation error in before rounding even starts. The Python 2 history also explains why this surprises so many people — if you learned round() before Python 3, the old half-away-from-zero behavior is the one you still expect.