Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei Vergleich von 2 Currency-Variablen (https://www.delphipraxis.net/116106-problem-bei-vergleich-von-2-currency-variablen.html)

Lemmy 23. Jun 2008 16:11


Problem bei Vergleich von 2 Currency-Variablen
 
Hallo zusammen,

ich habe hier ein Programm in dem ich viel Gebrauch von Currency-Variablen mache, damit ich Zahlen einfach vergleichen kann. Die 4 Nchkommastellen reichen mir locker für die Berechnung aus.

Das Problem: Auf manchen Rechnern (mit Delphi) wird nicht mit 4 Nachkommastellen gerechnet, sondern mit bis zu 8 Stellen. Ich verstehe nciht wie das passieren kann und wie ich das Problem abstellen kann (gut ich weiß schon, dass ich einen entsprechenden Vergleich mit einem delta machen kann).

Grüße
Lemmy

shmia 23. Jun 2008 16:34

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Hast du ein bisschen Code, der auf Rechner A funktioniert und auf Rechner B nicht?

himitsu 23. Jun 2008 16:41

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Da Currency intern nur ein skalierter Integer ist, kann ich mir auch nicht vorstellen, daß da auch mal mehr reinpassen kann.


es sei denn, du hast Currency in Berechnungen mit anderen Float-Typen gemischt und vergleichst dann die Ergebnise der Berechnungen und nicht die Currency-Variablen persönlich.

Lemmy 23. Jun 2008 18:39

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Hi,

nein, ich verwende zwar für eine Berechnung Double, aber das Ergebnis wird wieder als Currency nach "draussen" gegeben.

Hier ein bisschen Code:

Delphi-Quellcode:
function TClassParent.nGetDomainAreaSum: Currency;
var iIndex:Integer;
  oDomain:TDomain;
  nDomainArea:Currency;
begin
  nDomainArea:=0;
  for iIndex:=0 to oObjectListChildren.Count-1 do begin
    oDomain:=TDomain(oObjectListChildren.Items[iIndex]);
    nDomainArea:=nDomainArea+oDomain.nArea;
  end;
  result:=nDomainArea;
end;
oDomain.nArea ist auch wieder ein Currency:
Delphi-Quellcode:
    property nArea:Currency read FnArea write SetnArea;
Der Rückgabewert ist bei mir ein schöner Currency und bei einem Kollegen kommt (als Meldung) so was raus:

Die Fläche stimmt nicht überein: Parent: 125,34 m² Bereiche 125,3400638874!


Gibt es einen Compilerschalter oder Projekteinstellung die ein solches Verhalten erklären könnte? (Hinweis: Projektdateien schon gecheckt, Es handelt sich um den selben Code (Versionsverwaltung).
Delphi 2007 Prof, Windows XP

GRüße
Lemmy

alzaimar 23. Jun 2008 19:42

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Zitat:

Zitat von Lemmy
Die Fläche stimmt nicht überein: Parent: 125,34 m² Bereiche 125,3400638874!

Das fettgedruckte ist kein Currency und daher funktioniert der Vergleich auf Gleichheit nicht. Verwende die Differenz und vergleiche, ob der Absolutwert < 1/100 ist.

Medium 23. Jun 2008 23:02

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Willkommen zum guten alten, immer wieder aktuellen Thema: Ungenauigkeit von Floats *herunterbet*

Dazu findest du in der DP reichlich Lesestoff ;)

Edit: Delphi konvertiert bei Vergleichen übrigens immer in den größeren der beiden verglichenen Typen, so dass hier zwei Floats, und keine zwei Currencies verglichen werden. Hier im Forum suchenVergleich Double ist z.B. prima zum suchen.

Edit2: Im Grunde hast du also schon deine Genauigkeit kompromitiert, sobald du auch nur ein Mal Currency mit einem Floating Point Typen mischst, ausser du weisst ganz genau was da passiert, und fummelst manuell wieder alles zurecht. Aber an sich gilt: Entweder Fixpunkt, ODER Gleitkomma.

Lemmy 24. Jun 2008 07:33

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Hi,

also nochmal: Ich verwende seit Jahren nur noch Currency. Die 4 Nachkommastellen reichen mir aus und ich habe es bei Vergleichen wesentlich einfacher.

@alzaimar: und genau aus dem Grund stelle ich die Frage! Bei mir funktioniert der Code (und auch der Vergleich), bei meinem Kollegen nicht!

Und nun zu dem Mischen von Floats und Currency: Currency wird als Typ für die Felder von Klassen verwendet. Bei einer größeren Berechnung (die aber nichts mit dem Vergleich hier zu tun hat) verwende ich für das Zwischenergebnis einen Double. Das Zwischenergebnis wird aber nie nach draussen gegeben. Wenn die Berechnung fertig ist, wird der Double in einen Currency gewandelt.

Zu den Double-Vergleichen: Ich kenne die Funktionen zum Vergleich von Floats - nur hier habe ich einen Currency und ich verstehe nicht warum auf einmal (und zudem nicht immer) ein Float daraus wird.


Zitat:

Edit: Delphi konvertiert bei Vergleichen übrigens immer in den größeren der beiden verglichenen Typen, so dass hier zwei Floats, und keine zwei Currencies verglichen werden. Suche in der Delphi-PRAXiSVergleich Double ist z.B. prima zum suchen.
Das höre ich jetzt zum ersten mal! Warum sollte Delphi bei einem Integervergleich aus den Integern irgend welche Floats machen????

Grüße
Lemmy

alzaimar 24. Jun 2008 08:07

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Zitat:

Zitat von Lemmy
@alzaimar: und genau aus dem Grund stelle ich die Frage! Bei mir funktioniert der Code (und auch der Vergleich), bei meinem Kollegen nicht!...

Das kann aber nicht sein. Du siehst einen Float (das Fettgedruckte), da gibt es nichts daran zu deuten. Vielleicht doch eine ältere Version? Zeig mal mehr Code, vor allen Dingen den Vergleich und die Anzeige.

Zitat:

Zitat von Lemmy
Das höre ich jetzt zum ersten mal!

Beim Verknüpfen (Vergleich oder Operation) von zwei unterschiedlichen Zahlenwerten wird die Zahl mit dem kleineren Gültigkeitsbereich expandiert/umgewandelt.

Lemmy 26. Jun 2008 07:28

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Hallo,

Asche auf mein Haupt!

Ich habe in dem Code doch noch einen Float gefunden, der das Problem verursacht hat. Meinen Kollegen habe ich inzwischen geteert und gefedert. ;-)

Interessant, wie oft man einen Code anschauen kann und den eigentlichen Fehler übersieht....

Danke für Eure Aufmerksamkeit!
Grüße
Lemmy

Medium 26. Jun 2008 13:10

Re: Problem bei Vergleich von 2 Currency-Variablen
 
Man kann manchmal auch die Bäume vor lauter Wald nicht mehr sehen, normal :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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