gpt4 book ai didi

delphi - 为什么这段代码只运行了两次

转载 作者:行者123 更新时间:2023-12-03 15:50:29 25 4
gpt4 key购买 nike

我的代码只使用变量运行两次开始日期 := 27-01-2013日期停止 := 31-03-2013

我认为它应该以 2013 年 1 月 31 日、2013 年 2 月 28 日和 2013 年 3 月 31 日的结果运行但我只得到 2 个结果

我很确定我看太多了,看不到问题

begin
DateStart := EndOfTheMonth(DateStart);
while DateStart <= DateStop do
begin
FsFutureCreate(DateStart, cxDebit.Value, cxKredit.Value, aAccount, aType, aStore, aCity, txtText.Text, lRecord);
DateStart := EndOfTheMonth(IncMonth(DateStart));
end;
end;

最佳答案

要么 FsFutureCreate (您从未告诉我们它是什么)有一些副作用,或者您在浮点模糊方面遇到了一些问题。如您所知,日期和时间值是 double 值,因此类似 <= 的比较很危险。 (特别是如果您忽略时间部分,正如我下面的分析所示。)

第二种可能性更大。我刚刚尝试过

procedure TForm1.FormCreate(Sender: TObject);
var d: TDate; d2: TDate;
begin
d := EncodeDate(2013, 01, 31);
d := IncMonth(d); // 2013-02-28
d := EndOfTheMonth(d); // 2013-02-28
d := IncMonth(d); // 2013-03-28
d := EndOfTheMonth(d); // 2013-03-31

d2 := EncodeDate(2013, 03, 31);

// d is now 2013-03-31 23:59:59
// d2 is now 2013-03-31 00:00:00

ShowMessage(BoolToStr(d <= d2, true));

end;

得到false ,正如人们所期望的那样。因此,在这种情况下,问题是 EndOfTheMonth函数还将时间设置为当天的最后一秒(或毫秒)。但即使情况并非如此,当涉及到浮点值时,使用 = 进行比较也是危险的。

要修正您的比较,请执行以下操作

CompareDate(d, d2) <= 0

而不是

d <= d2.

我把它作为练习来找出答案,using the documentation ,为什么它有效且稳健。

关于delphi - 为什么这段代码只运行了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com