Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Thorsten Kalweit am 26.02.07 - 10:07:53
-
Hallo zusammen,
in unserer Rechnungsdatenbnak habe ich einen Rundungsfehler festgestellt:
Formel für den Bruttobetrag:
nbetrag+(nbetrag * ust_s / 100)
Nettobetrag:
313,50
19% von 313,50 = 59,57, obige Formel ergibt aber 373,06 statt 373,07 (Felder sind numerisch mit 2 Nachkommastellen)
Wisst Ihr, welches Problem da besteht?
-
Hängt nicht mit Lotus Notes zusammen. Das gibts in jeder Programmiersprache, die mit Gleitkommazahlen (floating point numbers) zu tun hat.
Du kannst solltest dir das mal durchlesen:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
Für mich beliebte: Alternativen zu floating point:
Der SQL Datentyp NUMERIC. Hier ist die Anzahl der Stellen hinter dem Komma fest definiert.
Die Java Klasse BigDecimal. Hier kann die Anzahl der Stellen hinter dem Komma sehr groß werden. Kann natürlich viel Speicher in Beschlag nehmen.
-
Du kannst solltest dir das mal durchlesen:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
OOpsy. Das kapier ich selber nicht so ganz. Das ist einfacher verständlich: http://de.wikipedia.org/wiki/Gleitkommazahl
-
öhhh... ich arbeite in der DB nicht mit Java. ;)
Meines Erachtens hat es dann doch mit Notes zu tun, bzw. mit dem Handlig der Zahlenwerte. :-:
Gibt es dazu einen einfachen Workaround?
-
Jo, den Faktor 100 oder größer, je nach belieben
Nettobetrag * 100 dann das Ergebnis wieder durch 100. Das sollte funktionieren.
-
Mit dem folgenden Workaround verhinderst du die Rundungsfehler:
Formel für den Bruttobetrag:
nbetrag+((nbetrag * ust_s / 100) + 0,005)
Axel
-
Joooo der Trick mit der 5! :D
Alles nach der zweiten Stelle wird ja Abgeschnitten...
-
Das ist ein allgemeines Problem beim Rechnen mit Gleitkommazahlen. Das ist programmiersprachen-unabhängig.
Auch mit 100 multiplizieren, etc. löst das Problem nicht, sobald du anfängst zu dividieren.
Du kannst halt Dinge wie 1/3 binär schwer erfassen.
-
Ja, diese Rechendramen kenne ich zu genüge.
Was auch lustig ist, ist einen Betrag ausrechnen und diesen dann auf volle 10€ aufrunden...
-
Was auch lustig ist, ist einen Betrag ausrechnen und diesen dann auf volle 10€ aufrunden...
Wieso?
Bernhard
-
Oft helfen aber gerade die sogenannten "Grundlagen" zu verstehen.
Hab nie Informatik studiert, aber es ist dann nach einigen Jahren "praktischer Arbeit" schon erstaunlich, wie viel sich z.B. von sowas in der realen Welt wiederfindet. Zum Bleistift hier: http://en.wikipedia.org/wiki/Data_structure
Gleitkommazahlen ist auch so ein Fall.
Man muß ja nicht jeden Tag Algorythmus Bücher wälzen, aber von Zeit zu Zeit mal zumindest an der Oberfläche der theoretischen Grundlagen zu kratzen find ich gar nicht so dumm. Das Relationale Datenbankmodell ist so ein anderes Thema mit interessanten theoretischen Verästelungen.