2012-11-02 127 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

时间值(TTimeTDateTDateTime)实际上是一个double(即,一个浮点值),并在整数部分编码的日期,并且通过小数部分编码中的时间。测试浮点值的相等性总是有风险的。您可以使用SameTime(time, date)代替。这正确地补偿'数字大惊小怪':Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

相关问题