Am 02.02.10 08:50, schrieb Stefan Sicurella:
Hi,
also ich rechne seit Jahren in meiner App mit 4 Stellen hinter dem Komma und
speichere diese Werte direkt als Double ab.
Das ging absolut problemlos, bis das jetzt mit dem kaufmännischen
Runden-Problem bei sehr kleinen Beträgen unter 1 Euro auftrat... was aber ja
auch zu lösen war.
Alles in Cent umrechnen reicht mir bei meiner Faktura auch nicht, denn hier
werden 4 Stellen hinter dem Komma benötigt, in dem Fall müsste man alle
Euro-Eingaben mal 10000 nehmen um einen 4Stellen hinter dem Komma Wert in eine
Integerzahl zu wandeln.
Aber ehrlich gesagt sehe ich im Moment auch nicht genau, was mir das bringen
soll, ich müsste schon alle Werte intern mit 100000 multiplizieren und mit
diesen Werten dann auch rechnen,
sobald dann der Benutzer eine zahl angezeigt bekommt muss sie wieder geteilt
und formatiert werden....
Nehmen wir als Beispiel doch mal deinen Code von gestern und schreiben
das in Integer-Berechnung um:
Dim i1, i2, i3, br, rabatt as Integer
Const faktor = 10000
rabatt = 45
i1 = 16.5 * faktor 'i1 = 165000
br = ( i1 / 100 ) * rabatt 'br = 74250
i1 = i1 - br 'i1 = 90750
i2 = i1 / ( 1.1 ) 'i2 = 82500
i3 = i1 - i2 'i3 = 8250
Jetzt hätten wir bei (8250 / 10000) wieder das übliche Ergebnis von
0,8250. Aber:
MsgBox format( i3 / faktor, ",###.00" ) '0,82
Ergibt weiterhin die angezeigte 0,82, weil (i3 / faktor) als
Fließkommazahl identisch umgewandelt wird. Wo liegt also der Vorteil in
der vorhergehenden Integer-Berechnung? Beim Berechnen mit i3 als Double
erhält man als Ergebnis "0.8250000000000011" wie Andy bereits treffend
bemerkt hatte. Je mehr Werte man also zur Berechnung hat, umso ungenauer
wird das Resultat bzw. irgendwann unterscheiden sich Centbeträge.
Mich würde allerdings noch interessieren wie man das Problem am Schluss
mit der Darstellung behebt, ohne die Integer-Werte in Fließkomma
umwandeln zu müssen. Schliesslich müsste nur das Komma an die richtige
Stelle gesetzt werden, da der Faktor bekannt ist.
--
Michael Kagerbauer
http://rbcoder.de