这是一个演示该问题的示例:
var
fdt, fndt : Double;
dt, dt2 : TDateTime;
begin
dt := EncodeDateTime(2023, 12, 31, //
20, 10, 5, 100);
dt2 := EncodeTime(20, 10, 5, 100);
fdt := Frac(dt);
fndt := Frac(dt2);
Memo1.Lines.Add('Equal: ' + BoolToStr(fdt = fndt, True) + CRLF + //
FloatToStr(fdt) + CRLF + //
FloatToStr(fndt) + CRLF + //
FormatDateTime('HH:NN:SS ZZZ', fdt) + CRLF + //
FormatDateTime('HH:NN:SS ZZZ', fndt) + CRLF + //
''
);
Exit;
结果是:
Equal: False
0,840336805558763
0,840336805555556
20:10:05 100
20:10:05 100
如您所见,时间部分与 Double 不同,但与格式化字符串相同。
为什么它们不同?
据我所知,EncodeDateTime 是 EncodeDate + EncodeTime。 日期 = Trunc(日期)。 所以小数部分必须相同!但事实并非如此。为什么? 也许一些时区信息?
感谢您提供有关它的任何信息。
环境:Win 11,Delphi S10,32位Exe。时区:欧洲/布达佩斯 (+2/+1)。
由于浮点的不准确性质,使用
=
运算符比较浮点值是否相等通常不准确。您必须考虑 epsilon 来查看这些值是否“足够接近”以被视为相等。
DateUtils.SameTime()
或 DateUtils.CompareTime()
来代替。