Forum: Datenbanken
Delphi
by Andreas13,
8. Apr 2021
Noch eine kleine Ergänzung, falls es jemanden interessieren sollte. Neben der Verwendung von vieeeeeelen Nachkommastellen (Multipräzisions-Arithmetik) gibt es etliche Literaturquellen mit ausgefeilten Algorithmen zur Fehlerkompensation diverser Rechenoperationen innerhalb der endlich begrenzten Stellenzahl (meistens für den DatenType Double).
Gute Beschreibungen sind zu finden u. a. in...
Forum: Datenbanken
Delphi
by Andreas13,
8. Apr 2021
Bei allen RealTypen gibt es unvermeidbare Rundungsfehler. Das liegt in der Natur der Sache, denn es gibt unendlich viele Reelle Zahlen, die wir mittels Single, Real48, Double oder Extended auf eine endliche Menge binärer Darstellungen mit endlichen Ziffern abbilden.
Selbst die Dezimalzahl 0,1 läßt sich binär nicht exakt darstellen, wodurch bereits bei der Eingabe ein Rundungsfehler entsteht. Da...
Forum: Datenbanken
Delphi
by Andreas13,
8. Apr 2021
Wenn Du nur die Integer-Potenzen von 10 benötigtst, könntest Du so vorgehen:
Function IntPower_of_10(n: Word): Extended;
// Integerpotenzen von 10
VAR
i, Pow: Integer;
Begin
Pow:= 1;
For i:= 1 To n Do
Forum: Datenbanken
Delphi
by Andreas13,
8. Apr 2021
Der Datentyp Currency ist allerdings keine „Allzweckwaffe“, denn die seine festen 4 Nachkommastellen sind nur bei Addition und Subtraktion von Währungseinheiten (mit max. 4 Nachkommastellen!) exakt. Bei Multiplikation, Division und sonstigen transzendenten Operationen pflanzen sich die Rundungsfehler in hintere Nachkommastellen fort und das Problem bleibt bestehen.
Wenn Du nPow := power(10,2);...
Forum: Datenbanken
Delphi
by Andreas13,
8. Apr 2021
Hallo gmc616,
Du solltest anstelle von nPow := power(10,2); besserConst nPow = 100 schreiben, denn power(..) arbeitet mit Logarithmen, wodurch automatisch Rundungsfehler in den letzten Stellen entstehen.
Bis Du Dir sicher, daß der Wert von Netto_Org genau 206,5 ist? Ein winziger Rundungsfehler bei der internen binären Darstellung z.B. von 206,4999999999 würde schon dazu führen, daß...