>>I have tried converting the variants to single and double format prior to and after the calcualtion, with no effect. The only way I have managed to get this to work correctly is to convert to currency, but surely this should not be necessary. It just makes no sense. <<
It actually makes all the sense in the world:
Both single and double use IEEE format and as such are approximate numeric values (and have been that way for at least the last 25 years), they cannot represent all the values available, and is also the reason they have such a vast range.
Currency on the other hand is in fact stored as an integer that is why it is always exact. It is returned offset by 10000 which explains the fact that it has a precision of 4 decimals.