为什么TTime比较会产生意想不到的结果?

时间:2012-11-02 19:06:14

标签: delphi datetime delphi-2010

我观察到有关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:00。但是,如果我将timedate的小时部分设置为9,则断言传递并且date计算为期望值。有些时间有效,有些则没有。有人可以解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:7)

时间值(TTimeTDateTDateTime)实际上是double(即浮点值),日期编码在整数部分,以及由小数部分编码的时间。测试浮点值的相等性总是有风险的。

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

相关问题