5

EncodeDateTime私はとメソッドに関してある種の奇妙な振る舞いを観察しました、EncodeTimeそして私はいくつかの説明を求めています。

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。しかし、との時間部分を9に設定するtimedate、アサーションは渡さdateれ、期待値に評価されます。働く時間もあれば、働かない時間もあります。誰かが私に何が起こっているのか説明できますか?

4

1 に答える 1

7

時間値(TTime、、)は実際にはTDate(つまり、浮動小数点値)であり、日付は整数部分でエンコードされ、時間は小数部分でエンコードされます。また、浮動小数点値の同等性をテストすることは常に危険です。TDateTimedouble

代わりに使用できますSameTime(time, date)。これは「数値的な騒ぎ」を正しく補正します。Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

于 2012-11-02T19:09:08.227 に答える