5

我观察到一些关于EncodeDateTimeEncodeTime方法的奇怪行为,我正在寻求一些解释。

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:00time但是,如果我将和的小时部分设置date为 9,则断言通过并date计算为预期值。有些时间工作,而另一些时间则不工作。有人可以解释一下发生了什么吗?

4

1 回答 1

7

时间值(TTime, TDate, TDateTime)实际上是一个double(即浮点值),日期以整数部分编码,时间以小数部分编码。测试浮点值的相等性总是有风险的。

你可以SameTime(time, date)改用。这正确地补偿了“数字大惊小怪”:Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

于 2012-11-02T19:09:08.227 回答