Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySql und Rechenoperationen (https://www.delphipraxis.net/71887-mysql-und-rechenoperationen.html)

MasterBasti 22. Jun 2006 01:45

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:
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;
Ich hoffe, ich konnte das Problem einigermaßen gut Erklären, ich habe jedenfalls keine Erklärung für diese Zauberei,
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

Christian Seehase 22. Jun 2006 02:20

Re: MySql und Rechenoperationen
 
Moin Basti,

das liegt einfach an der internen Darstellung/Verarbeitung von Gleitkommazahlen.
Probier einfach mal das aus:

Delphi-Quellcode:
var
  Wert1 : double;
  Wert2 : double;
  Wert3 : double;

begin
  Wert1 := 11.88;
  Wert2 := 6;
  Wert3 := 17.88;
  ShowMessage(FloatToStr(Wert1+Wert2-Wert3));
end;
Du wirst sehen, dass das Ergebnis exakt Deinem entspricht.
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.

JKING 22. Jun 2006 06:22

Re: MySql und Rechenoperationen
 
Hallo,
Ich verwende für Beträge den MySQL-Datentyp decimal(8,2)
Damit sollte es dann funktionieren.

Gollum 22. Jun 2006 07:42

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;

MasterBasti 22. Jun 2006 11:18

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

Sharky 23. Jun 2006 05:59

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 02:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz