2012-11-02 2 views
5

EncodeDateTimeEncodeTime 방법과 관련하여 이상한 행동이 관찰되었으며 몇 가지 설명을 구합니다.TTime 비교가 예기치 않은 결과를 나타내는 이유는 무엇입니까?

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; 

는 내가 발견 한 것은 date의 시간 부분이 7:59:59 대신 8:00:00로 평가한다는 것입니다. 그러나 시간 부분을 timedate을 9로 설정하면 어설 션이 완료되고 date이 예상 값으로 평가됩니다. 몇 시간 동안 일하는 반면 다른 일은하지 않습니다. 누군가 무슨 일이 일어나는지 나에게 설명해 줄 수 있니?

답변

7

시간 값 (TTime, TDate, TDateTime)이 실제로있는 double (즉, 부동 소수점 값이다) 정수 부분으로 인코딩 날짜와 소수부로 인코딩 된 시간. 부동 소수점 값의 동일성을 테스트하는 것은 항상 위험합니다.

대신 SameTime(time, date)을 사용할 수 있습니다. 이는 '수치스러운 소동'을 올바르게 보완합니다. Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

관련 문제