![]() |
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? |
Re: 38109,791667 <> 38109,791667?
wie genau gleich sollen sie sein (Tag,Stunde,Minute...)
|
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
|
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ß ![]() PS: TDateTime ist ein Double also eine Fließkommazahl ![]() |
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:
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...
GenaueZeit := Trunc(dtp_Datum.Date)+Frac(dtp_Zeit.Time);
|
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...
|
Re: 38109,791667 <> 38109,791667?
Ja, ich habe das Problem gelöst, mit FloatToStr... Danke vielmals :hello:
|
Re: 38109,791667 <> 38109,791667?
Zitat:
|
Re: 38109,791667 <> 38109,791667?
Zitat:
Value=38109,791667 BoundaryRight=38109,791667
Delphi-Quellcode:
bRes1 ist False, bRes2 hingegen True...ich hab auch gestaunt
bRes1 := Value=BorderRight;
bRes2 := FloatToStr(Value)=FloatToStr(BorderRight); |
Re: 38109,791667 <> 38109,791667?
Probier mal sowas wie
Delphi-Quellcode:
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.
const epsilon = 0.0000000001;
[...] if (abs(value - BorderRight) < epsilon) then //... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 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