![]() |
Datenbank: MYSQL • Version: 4.x • Zugriff über: ZEOS
MySql und Rechenoperationen
Hallo zusammen,
mich wundert es, dass 17,88 EUR - 17,88 EUR = 1,77635683940025E-15 sind. Naja, vllt. mal eine kurze Beschreibung zum Problem... :) Ich habe 2 Felder: Tabelle 1: Invoice teilzahlung (double 10,2) Tabelle 2: Invoicepositions summe (double 10,2) Die Rechnung setzt sich aus 2 Positionen (Tabelle 2) zusammen... Summe 1: 11,88 EUR Summe 2: 6,00 EUR Die Summe ergiebt im Programm erstaunlicherweise auch 17,88 EUR ;-) Wenn ich allerdings die Teilzahlung von 17,88 EUR aus Tabelle eins von der Summe aus Tabelle 2 abziehe, kommt das raus: 1,77635683940025E-15 Habt Ihr eine Erklärung dafür ? Hier ist der Code....
Delphi-Quellcode:
Ich hoffe, ich konnte das Problem einigermaßen gut Erklären, ich habe jedenfalls keine Erklärung für diese Zauberei,
posumme := 0;
for i := 1 to DataModule1.RechnungDB.RecordCount do begin DataModule1.RechnungDB.RecNo := i; DataModule1.Rechnungspositionen.SQL.Text := 'SELECT * FROM invoicepositions WHERE rechnungsid=' + QuotedStr(DataModule1.RechnungDB.Fieldbyname('rechnungsid').AsString); DataModule1.Rechnungspositionen.Open; tempposumme := 0; for z := 1 to DataModule1.Rechnungspositionen.RecordCount do begin DataModule1.Rechnungspositionen.RecNo := z; tempposumme := tempposumme + DataModule1.Rechnungspositionen.Fieldbyname('Summe').AsFloat; end; posumme := posumme + tempposumme; offen := posumme - DataModule1.RechnungDB.Fieldbyname('Teilzahlung').AsFloat; end; zumal die einzelnen BEträge alle Sinngemäß per showmessage ausgegeben werden. Nach dem Subtrahieren allerdings nicht mehr.... :( Jemand eine Idee woran das liegen könnte ? Gruß MasterBasti |
Re: MySql und Rechenoperationen
Moin Basti,
das liegt einfach an der internen Darstellung/Verarbeitung von Gleitkommazahlen. Probier einfach mal das aus:
Delphi-Quellcode:
Du wirst sehen, dass das Ergebnis exakt Deinem entspricht.
var
Wert1 : double; Wert2 : double; Wert3 : double; begin Wert1 := 11.88; Wert2 := 6; Wert3 := 17.88; ShowMessage(FloatToStr(Wert1+Wert2-Wert3)); end; Nimm doch, ersatzweise, mal den Datentyp Currency. Oder Du rundest, dann müsste auch 0 herauskommen (man beachte die 10 hoch -15) Ich weiss jetzt nicht, ob MySQL auch den Datentyp Money kennt, der entspricht allerdings Currency in Delphi. |
Re: MySql und Rechenoperationen
Hallo,
Ich verwende für Beträge den MySQL-Datentyp decimal(8,2) Damit sollte es dann funktionieren. |
Re: MySql und Rechenoperationen
Hallo,
das Problem liegt an FloatToStr. Benutze stattdessen FormatFloat;
Delphi-Quellcode:
var
Wert1 : double; Wert2 : double; Wert3 : double; begin Wert1 := 11.88; Wert2 := 6; Wert3 := 17.88; ShowMessage(FormatFloat('#,#0.00', (Wert1+Wert2-Wert3)); end; |
Re: MySql und Rechenoperationen
Ich danke euch für die reichlichen Antworten....
Das Umändern von Float in Currency hat leider nichts gebracht, hingegen habe ich die Funktion Floattostr ersetzt durch FormatFloat... und siehe da, Ergebnis = 0 PRIMA! Danke für die Hilfe... Gruß Master-Basti |
Re: MySql und Rechenoperationen
Hai Master-Basti,
je nach Anwendung wäre es eventuell auch möglich das Du die Zahlen einfach als Ganzzahl speicherst. Du trägst also in die DB nicht 17,88 Euro sonder 1788 Cent ein. Jetzt musst Du das nur noch beim speichern und laden aus der DB berücksichtigen. Damit hast Du die gesamt problematik mit den Fliesskommazahlen umgangen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz