Delphi-PRAXiS

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.

alcaeus 29. Apr 2004 19:37

Re: 38109,791667 <> 38109,791667?
 
Danke Chewie! Das erscheint logisch...ich werds probieren

Jörn 29. Apr 2004 21:14

Re: 38109,791667 <> 38109,791667?
 
Vielleicht würde auch folgendes funzen:

Delphi-Quellcode:
if iszero(Value - BorderRight) then
...

Chewie 29. Apr 2004 22:03

Re: 38109,791667 <> 38109,791667?
 
Was macht die Funktion iszero und wo ist sie deklariert? Mein Delphi5 kennt sie jedenfalls nicht...

alcaeus 30. Apr 2004 10:14

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

Zitat von Delphi OH
Die Funktion IsZero gibt an, ob eine Gleitkommavariable oder ein Gleitkommaausdruck den Wert Null oder beinahe Null hat.

Das ist bei einem D6 Pro, ich glaub die gibts erst ab D6, aber ich bin mir nicht sicher...

Phoenix 30. Apr 2004 12:08

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

Zitat von Delphi OH
Die Funktion IsZero gibt an, ob eine Gleitkommavariable oder ein Gleitkommaausdruck den Wert Null oder beinahe Null hat.

Und wenn Null besonders gross ist, ist es fast so gross wie ein bisschen Eins :cyclops:

Jörn 30. Apr 2004 14:32

Re: 38109,791667 <> 38109,791667?
 
Also bei Delphi 6 PE gibts das auf jeden Fall...


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