2012-11-02 13 views
5

Ich habe eine Art seltsames Verhalten in Bezug auf die EncodeDateTime und EncodeTime Methoden beobachtet und ich suche eine Erklärung.Warum ergeben TTime-Vergleiche unerwartete Ergebnisse?

procedure SomeTestCase; 
var 
    time: TTime; 
    dateTime: TDateTime; 
begin 
    time := EncodeTime(8, 0, 0, 0); 
    date := EncodeDateTime(2012, 11, 2, 8, 0, 0, 0); 

    Assert(time = TimeOf(date)); //Fails 
end; 

Was ich habe, ist, festgestellt, dass date ‚s Stunde Abschnitt 7:59:59 statt 8:00:00 auswertet. Aber wenn ich den Stundenanteil von time und date auf 9 setze, läuft die Bestätigung und date wertet den erwarteten Wert aus. Einige Stunden arbeiten, andere nicht. Kann mir jemand erklären, was vor sich geht?

Antwort

7

Ein Zeitwert (TTime, TDate, TDateTime) ist eigentlich ein double (das heißt, einen Gleitkommawert), mit dem Datum in dem ganzzahligen Teil kodiert, und die Zeit, durch fraktionierten Teil codiert. Und es ist immer riskant, die Gleichheit der Fließkommawerte zu testen.

Sie können stattdessen SameTime(time, date) verwenden. Dies kompensiert korrekt 'numerischen Aufwand': Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

Verwandte Themen