AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zahlenvergleich vom Typ Real

Ein Thema von Sidi61 · begonnen am 7. Jan 2018 · letzter Beitrag vom 8. Jan 2018
Antwort Antwort
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#1

Zahlenvergleich vom Typ Real

  Alt 7. Jan 2018, 20:43
Hallo zusammen,

bin heute auf ein Problem gestoßen welches ich mir nicht erklären kann.
Ganz banale Sache - in einem Eingabeformular für ein Kassenbuch soll eine Rechnung erfasst werden. Eingangs wird der Gesamtbetrag eingegeben dann stehen 4 Editfelder für die Eingabe von Einzelbeträgen mit Zuweisung verschiedener Buchungskonten zur Verfügung.

Konkreter Fall (komischer Weise nur bei dieser Zahlenkombination)
Rechnungsbetrag : 43,60
Einzelbetrag1 : 20,95
Einzelbetrag2 : 22,65

Um Eingabefehler zu vermeiden soll die Summe der Einzelbeträge mit dem Gesamtbetrag verglichen werden

var GesBetrag, Summe : Real;

GesBetrag := StrToFloat(Edit.Rechbetrag.text);
Summe := StrToFloat(Edit.Einzelbetrag1.text) + StrToFloat(Edit.Einzelbetrag2.text);

Bei der Prüfung
if GesBetrag <> Summe then ShowMessage('Summendifferenz Rechnungsbetrag: '+FloatToStr(GesBetrag)+' zu Summe Einzel: '+FloatToStr(Summe));

wird ein Fehler angezeigt: Summendifferenz Rechnungsbetrag: 43,6 zu Summe Einzel: 43,6

Das Programm nimmt an dass der GesBetrag größer als die Summe ist. Komischer Weise nur bei dieser Zahlenkombination.

Habe mir jetzt wie folgt geholfen:
if (GesBetrag <> Summe) and (FloatToStr(GesBetrag)<>FloatToStr(Summe)) then

So funktioniert es, das kann aber nicht die Lösung sein
Hat jemand eine Idee??

Ist kein Scherz!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Zahlenvergleich vom Typ Real

  Alt 7. Jan 2018, 20:48
Das nennt sich Gleitkommaungenauigkeit bzw. Rundungsfehler. Du solltest Floats am besten immer mit einer Epsilon-Schranke vergleichen, also z.b. if (A + B < Epsilon) , wobei Epsilon einfach eine enorm kleine Zahl sein sollte.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Zahlenvergleich vom Typ Real

  Alt 7. Jan 2018, 20:57
verstehe ich jetzt nicht

Rundungsfehler bei Division ja, aber bei Addition??
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Zahlenvergleich vom Typ Real

  Alt 7. Jan 2018, 21:17
Doch das kommt leider vor, ich hatte mal ein einfaches Beispiel, finde ich aber nicht, da kam beim Typen real bei 3x4 oder sowas 11,99 raus. Extended als Type wäre quick and dirty.
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.443 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zahlenvergleich vom Typ Real

  Alt 7. Jan 2018, 21:26
Die Unit System.Math bietet dafür die Funktion SameValue .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Zahlenvergleich vom Typ Real

  Alt 8. Jan 2018, 09:41
Du solltest den Typ Currency verwenden. Die Fließkommatypen Sind meist nur Näherungswerte (die Mathematik dahinter können Dir andere besser erklären). D.H es kann sein, daß Du 12.5 erwartest aber 12,4999999 oder 12,50001 erhältst. Wenn du die Werte mit einer Nachkommastelle darstellst sehen sie gleich aus sind es aber nicht.

Gruß
K-H

P.S.

verstehe ich jetzt nicht

Rundungsfehler bei Division ja, aber bei Addition??
Fließkommazahlen sind Berechnungen.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Zahlenvergleich vom Typ Real

  Alt 8. Jan 2018, 11:11
Oder du nimmst gleich Ganzzahltyp Int64 oder so, falls dein Zahlenbereich es zu läßt. Ich hatte vor einigen Jahren mal ein Projekt gehabt, wo ich die Gesamtsumme von den gekauften Aktien(mit 4-stellige Kommazahlen) ausrechnen mußte, also eigentlich eine simple Aufgabe und bin auch auf das Problem gestossen, dass die Gleitkommadarstellung bei einigen Zahlen nicht genau arbeiten, wenn man exakt vergleicht. Habe einfach alles mit 10000 multipliziert, da es sich bei mir um 4-stellige Kommazahlen gehandelt haben, und den Vergleich mit Int64 gemacht.

lg,
jus

Geändert von jus ( 8. Jan 2018 um 11:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zahlenvergleich vom Typ Real

  Alt 8. Jan 2018, 11:17
verstehe ich jetzt nicht

Rundungsfehler bei Division ja, aber bei Addition??
Weil Fließkommatypen eben per se bereits aus Multiplikationen/Divisionen bestehen.

http://docwiki.embarcadero.com/RADSt...)#Reelle_Typen


Oder du nimmst gleich Ganzzahltyp Int64 oder so, ...
Rate mal was ein Currency ist.
Das ist ein Int64, wo die letzten 4 Dezimalstellen als Nachkomma genutzt werden, also /10000 .

Wenn du das selber mit einem Int64 machst, mußt du z.B. bei Multiplikationen und Divisionen aufpassen, dass danach die Nachkommastellen stimmen. Ebenso mußt du bei Multiplikation mit Überläufen aufpassen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Jan 2018 um 11:20 Uhr)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Zahlenvergleich vom Typ Real

  Alt 8. Jan 2018, 11:42
...
Oder du nimmst gleich Ganzzahltyp Int64 oder so, ...
Rate mal was ein Currency ist.
Das ist ein Int64, wo die letzten 4 Dezimalstellen als Nachkomma genutzt werden, also /10000 .

Wenn du das selber mit einem Int64 machst, mußt du z.B. bei Multiplikationen und Divisionen aufpassen, dass danach die Nachkommastellen stimmen. Ebenso mußt du bei Multiplikation mit Überläufen aufpassen.
Ok, wenn Currency es genauso macht, ist es ja gut, muß ich gestehen, hatte ich nicht gewußt. Ich hatte damals nur Multiplikationen Kommazahl mit Ganzzahl gebraucht. Mir ist es damals auch nur deswegen aufgefallen, weil mein Algorithmus nur bei bestimmten Zahlen abgestürzt ist.

lg,
jus

Geändert von jus ( 8. Jan 2018 um 11:44 Uhr)
  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:30 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