我已经观察到有关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
。但是,如果我将time
和date
的小时部分设置为9,则断言会通过,并且date
会计算为预期值。有些时间可以工作,而另一些则不能。有人可以解释一下发生了什么吗? 最佳答案
时间值(TTime
,TDate
,TDateTime
)实际上是double
(即浮点值),日期编码为整数部分,时间编码为小数部分。测试浮点值的相等性总是有风险的。
您可以改用SameTime(time, date)
。这可以正确补偿“数字麻烦”:Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;
关于delphi - 为什么TTime比较会产生意想不到的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13201535/