That level of rounding is not surprising if you are using a floating-point data type (such as Double or Single). Floating-point numbers are designed for a high level of speed, at the expense of a small loss of accuracy.

If you want full accuracy, Currency (which is stored as a scaled integer) is the kind of thing you should be using.