Decimal(9,3) can store -999,999.999 to 999,999.999
Decimal(9,4) is -99,999.9999 to 99,999.9999
Not sure, but I think they're stored differently internally - decimal as an integer* with a factor of 10 multiplier, money as a standard integer.
E.g. in decimal(9,4), 12345.6789 is stored as 123456789 x 10^-4
*(Integer here means the mathematical definition, not the datatype).
As precision increases, the bytes needed to store the integer increase to accommodate the maximum possible value.
4 bytes is enough to store 999,999,999 but not 9,999,999,999
Perhaps the extra byte stores the factor of 10 to multiply by?
For smallmoney, you'll notice the maximum value of a 4-byte integer is 2,147,483,647, which equals 214,748.3647 x 10^4, the maximum value of smallmoney. Don't need to store the factor of 10 multiplier as it's always -4 in smallmoney.