This is the result of the innate inadequacy of computers (via binary data) to work with floats. Floating point - Accuracy problems.
The modeler and runtime try to enforce the decimal precision on currency but when you start calculating with them, it's best to include a round(total, 2) to make sure you get the same decimal precision as you started with. (Although the rounding in itself could lead to rounding differences)
Other systems have a type Decimal for this purpose.
A way to emulate this is to use Long/Integer in the background to do all calculations with (exact calculations) and for presentation use a Float or String. Off course this needs a lot of extra programming.