Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mit Zeitwerten rechnen -> Wege, um StrToTime zu umgehen ?


trm - Di 15.11.11 22:48
Titel: Mit Zeitwerten rechnen -> Wege, um StrToTime zu umgehen ?
Hi,


in MaskEditfeldern habe ich verschiedene Uhrzeiten stehen im Format:


Delphi-Quelltext
1:
!90:00;1;_                    


so dass Zeiten von 00:00 bis 23:59 (Uhr) möglich sind (wird extra geprüft).

Es gibt paarweise zwei Felder, eines für den Start und eines für das Ende Bsp.:


Quelltext
1:
2:
Edit1 = 07:00
Edit2 = 12:00


Nun versuche ich mit einem definierten Intervall Bsp.:


Quelltext
1:
Intervall = 15                    


die Startzeit bis zur Endzeit zu durchlaufen und einen Wert mit einem anderen zu vergleichen.

Dies scheitert wohl an der Umrechnung..


Delphi-Quelltext
1:
StrToTime(Edit1.Text + ':00')                    


..da hier irgendwie ein Rundungfehler eintritt (?)

Bei manchen Werten wird der Vergleich korrekt ausgeführt, bei manch anderen nicht.

Dies hier wird positiv verglichen: 0,34375
Dies hier nicht: 0,36458333333

Im Debugger sind aber die Werte bei mVergleich gleich.

Was kann ich da tun ?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 15.11.2011 um 22:52


jaenicke - Di 15.11.11 23:12

Wie vergleichst du denn?

Gleitkommazahlen lassen sich nicht per = vergleichen, da es durch die interne Darstellung kleine Abweichungen geben kann. Es gibt in der Unit Math aber die Funktion SameValue dafür.


bummi - Di 15.11.11 23:40

gegf. MinutesBetween oder SecondsBetween < x aus den DateUtils ....


trm - Mi 16.11.11 01:14

Danke euch beiden.

Mir reicht der Vergleich mittels SameValue.
Komisch nur, dass eine Subtraktion genauer arbeitet als ein Vergleich.
Verstehen kann ich das leider nicht :(

Ist dieses Verhalten in höheren Versionen nach Delphi 7 immer noch so (ist das vielleicht gewollt) ?


jaenicke - Mi 16.11.11 06:43

Umgekehrt:
Der Vergleich arbeitet genauer. Und eben zu genau in vielen Fällen, weil zwei Werte sich weit hinter dem Komma durch die Binärdarstellung im PC unterscheiden können, die man eigentlich als gleich ansieht. Deshalb schaut die Funktion nicht, ob die Zahl exakt gleich ist, sondern ob die Differenz unterhalb der Darstellungsungenauigkeit ist. ;-)


Dude566 - Mi 16.11.11 11:46

Weil ich es gerade passend finde: http://www.michael-puff.de/Programmierung/Artikel/Fliesskomma.shtml


trm - Mi 16.11.11 13:03

Ok, ich habs :)

Vielen Dank nochmals an euch, ihr seid super :)

Gruß aus der kalten Mitte Deutschlands ;)