From this
article (a good read):
Fixed-point Type
The System.Decimal type is a kind of hybrid between an
integer and a floating-point number. It is a 128-bit (16-byte) data structure
that can exactly represent values ranging from
-79,228,162,514,264,337,593,543,950,335 to negative
79,228,162,514,264,337,593,543,950,335, with up to 29 significant digits. The C#
name for this type is decimal. In Visual Basic it's
Decimal.
The Decimal type is a structure that consists of a 1-bit
sign, a 96-bit integer, and a scaling factor that specifies where to put the
decimal point. The scaling factor is a number from 0 to 28, representing the
number 10 raised to that power, which is used to divide the 96-bit integer. So,
if the integer number is 12 and the scaling factor is 1, then the value
represented is 12 divided by 101, or 1.2.
The beauty of this type is that it can exactly represent decimal
values—something that's especially important when working with
currency values. Whereas floating-point numbers are approximations (albeit very
close approximations), decimal values are exact. For example, if you use a
floating-point type to add and subtract currency values, eventually you'll
end up with a number that has more than just two decimal places. You might end
up with 349.999997, for example.
If you use a Decimal type to add currency values,
you'll always end up with two decimal places.