Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 38109,791667 <> 38109,791667? (https://www.delphipraxis.net/21238-38109-791667-38109-791667-a.html)

alcaeus 29. Apr 2004 17:22


38109,791667 <> 38109,791667?
 
Hi! Ich vergleiche in meiner Routine zwei DateTime-Werte:
Value=38109,791667
BoundaryRight=38109,791667

Wenn ich im Debug-Modus die beiden Werte anschaue, so sind sie exakt gleich, jedoch gibt der Vergleich Value=BoundaryRight immer False. Kennt jemand das Problem und eventuelle Schritte dagegen?

Leuselator 29. Apr 2004 17:38

Re: 38109,791667 <> 38109,791667?
 
wie genau gleich sollen sie sein (Tag,Stunde,Minute...)

alcaeus 29. Apr 2004 17:48

Re: 38109,791667 <> 38109,791667?
 
Naja, eigentlich dürfte das hier keine Rolle spielen, denn mir liegen die obigen Werte vor, die stehen für den 2. Mai, 19 Uhr. Das heißt, die Bedingung müsste True ergeben, was sie leider nicht tut, und mich bringt das Problem seit 20 Minuten zur Verzweiflung

Leuselator 29. Apr 2004 17:52

Re: 38109,791667 <> 38109,791667?
 
Ich fragte nicht so "obenhin", weil Dein Problem tiefer geht - nun gut da Du es nicht sagen möchtest, bleibt Dir nur der lange Weg - selber lernen. Lies Dir in dem untenstehenden Link die Seite 2 und das "Rezept 2.3 Vergleich von Fließkommazahlen" durch - dann siehst Du klar :-)
Gruß
Artikel

PS: TDateTime ist ein Double also eine Fließkommazahl Dieser Artikel stellt das Problem auch gut dar

alcaeus 29. Apr 2004 18:16

Re: 38109,791667 <> 38109,791667?
 
Na gut... nachdem dus unbedingt wissen willst, ich arbeite mit zwei DateTimePickern, einem fürs Datum, einem für die Zeit. Anschließend zähle ich die beiden Werte so zusammen:
Delphi-Quellcode:
GenaueZeit := Trunc(dtp_Datum.Date)+Frac(dtp_Zeit.Time);
Das Ergebnis dieser Rechnung ist der obenstehende Wert. Der DateTimePicker für die Zeit muss also auf die Sekunde genau sein. Ich kann aber noch nicht nachvollziehen, wozu diese Information gut ist. Ich probiere jetzt mal den Vergleich als String...

Leuselator 29. Apr 2004 18:18

Re: 38109,791667 <> 38109,791667?
 
Die Antwort findest Du in den genannten Artikeln - dort ist beschrieben, warum das, was Du tust schief geht, und wie es besser geht...

alcaeus 29. Apr 2004 18:19

Re: 38109,791667 <> 38109,791667?
 
Ja, ich habe das Problem gelöst, mit FloatToStr... Danke vielmals :hello:

Luckie 29. Apr 2004 18:54

Re: 38109,791667 <> 38109,791667?
 
Zitat:

Zitat von alcaeus
Ja, ich habe das Problem gelöst, mit FloatToStr... Danke vielmals :hello:

:shock:

alcaeus 29. Apr 2004 18:57

Re: 38109,791667 <> 38109,791667?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von alcaeus
Ja, ich habe das Problem gelöst, mit FloatToStr... Danke vielmals :hello:

:shock:

Ja:
Value=38109,791667
BoundaryRight=38109,791667
Delphi-Quellcode:
bRes1 := Value=BorderRight;
bRes2 := FloatToStr(Value)=FloatToStr(BorderRight);
bRes1 ist False, bRes2 hingegen True...ich hab auch gestaunt

Chewie 29. Apr 2004 19:35

Re: 38109,791667 <> 38109,791667?
 
Probier mal sowas wie

Delphi-Quellcode:
const epsilon = 0.0000000001;


[...]
if (abs(value - BorderRight) < epsilon) then //...
Aufgrund der Natur von Fließkommazahlen ist es recht unwahrscheinlich, dass sie völlig identisch sind. Deshalb gibst du die Genauigkeit an. Je näher dieses epsilon an 0 dran ist, desto genauer wird der Vergleich. Ist er zu nah an 0 dran, kann es halt passieren, dass er nicht mehr korrekt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr.
Seite 1 von 2  1 2      

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