• 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.