Floating point numbers are stored as base 2 not base 10, which means that they have a different set of infinite repeating decimals. .1 is a base2 infinite repeater. If float didn't have a problem you were probably lucky and had it round up and the error truncate away. Decimal is a base 10 representation, and consequently much slower than native floating types. It does however behave exactly like the user naive expectation.