2012-11-02 14 views
5

Ho osservato un qualche tipo di comportamento strano riguardante i metodi EncodeDateTime e EncodeTime e sto cercando qualche spiegazione.Perché i confronti TTime danno risultati imprevisti?

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; 

Quello che ho trovato è quella porzione date s' ora restituisce 7:59:59 invece di 8:00:00. Ma se imposto la porzione oraria di time e date a 9, l'assert passa e date valuta il valore previsto. Alcune ore di lavoro mentre altre no. Qualcuno può spiegarmi cosa sta succedendo?

risposta

7

Un valore temporale (TTime, TDate, TDateTime) è in realtà un double (cioè un valore a virgola mobile), con la data codificata nella parte intera, e il tempo codificata in da parte frazionaria. Ed è sempre rischioso testare l'uguaglianza dei valori a virgola mobile.

È possibile utilizzare invece SameTime(time, date). Questo compensa correttamente per "confusione numerica": Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

Problemi correlati