AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MySql und Rechenoperationen
Thema durchsuchen
Ansicht
Themen-Optionen

MySql und Rechenoperationen

Ein Thema von MasterBasti · begonnen am 22. Jun 2006 · letzter Beitrag vom 23. Jun 2006
Antwort Antwort
MasterBasti

Registriert seit: 3. Jun 2004
22 Beiträge
 
#1

MySql und Rechenoperationen

  Alt 22. Jun 2006, 02:45
Datenbank: MYSQL • Version: 4.x • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: MySql und Rechenoperationen

  Alt 22. Jun 2006, 03:20
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
JKING

Registriert seit: 11. Apr 2005
Ort: Ingolstadt
3 Beiträge
 
#3

Re: MySql und Rechenoperationen

  Alt 22. Jun 2006, 07:22
Hallo,
Ich verwende für Beträge den MySQL-Datentyp decimal(8,2)
Damit sollte es dann funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: MySql und Rechenoperationen

  Alt 22. Jun 2006, 08:42
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;
  Mit Zitat antworten Zitat
MasterBasti

Registriert seit: 3. Jun 2004
22 Beiträge
 
#5

Re: MySql und Rechenoperationen

  Alt 22. Jun 2006, 12:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: MySql und Rechenoperationen

  Alt 23. Jun 2006, 06:59
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.
Stephan B.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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