2012-11-02 27 views
5

Tôi đã quan sát thấy một số loại hành vi kỳ lạ liên quan đến các phương pháp EncodeDateTimeEncodeTime và tôi đang tìm kiếm một số giải thích.Tại sao so sánh TTime lại cho kết quả không mong muốn?

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; 

Những gì tôi đã tìm thấy là phần giờ date 's đánh giá để 7:59:59 thay vì 8:00:00. Nhưng nếu tôi đặt phần giờ của timedate thành 9, xác nhận vượt qua và date đánh giá giá trị mong đợi. Một số giờ làm việc trong khi một số người khác thì không. Ai đó có thể giải thích cho tôi chuyện gì đang xảy ra?

Trả lời

7

Một giá trị thời gian (TTime, TDate, TDateTime) thực sự là một double (có nghĩa là, một giá trị dấu chấm động), với ngày được mã hóa trong một phần số nguyên, và thời gian mã hóa bằng phần phân đoạn. Và nó luôn luôn nguy hiểm để kiểm tra sự bình đẳng của các giá trị dấu phẩy động.

Thay vào đó, bạn có thể sử dụng SameTime(time, date). Điều này bù đắp chính xác cho 'số fuss': Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

Các vấn đề liên quan