Me habia encontrado con ese problema en Access, lo achacaba a su gan nivel...
No, haber la explicación de esto debe estar en el nivel binario de un campo Double, por lo que sea al hacer la operacion entre dos numeros aparece un residuo... yo siempre he optado por redondear el resultado al numero de decimales que me interesa (generalmente 2 en el caso de las monedas) y despreciar el resto...
En pseudo codigo
(Entero((
CampoA-CampoB)*100)+.5)/100
Con eso consigues un numero de dos decimales limpio de residuos.... puedes sustituir la operación entre campos (en rojo) por cualquier otra...
(supongo que el error es el 000008 y no que de 40 cuando deberia dar 30 el ejemplo que has puesto)
Cita: 45.30 - 15.20 se convierte en 40.10000000008
Quim