2012-11-02 13 views
5

Zaobserwowałem jakieś dziwne zachowanie dotyczące metod EncodeDateTime i EncodeTime i szukam wyjaśnienia.Dlaczego porównania TTime dają nieoczekiwane wyniki?

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; 

Co znalazłem to, że godzina część date „s ma wartość 7:59:59 zamiast 8:00:00. Ale jeśli ustawię część godzinową na time i date na 9, assert przejdzie i date oszacuje oczekiwaną wartość. Kilka godzin działa, a inne nie. Czy ktoś może mi wyjaśnić, co się dzieje?

Odpowiedz

7

czas (TTime, TDate, TDateTime) jest w rzeczywistości double (to jest, wartość zmiennoprzecinkową) z datą zakodowany w części całkowitej i czasu zakodowany w części ułamkowej. I zawsze jest ryzykowne testowanie równości wartości zmiennoprzecinkowych.

Zamiast tego można użyć SameTime(time, date). To kompensuje poprawnie "zamieszanie numeryczne": Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

Powiązane problemy