首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++\CLI DateTime计算误差

C++\CLI DateTime计算误差
EN

Stack Overflow用户
提问于 2014-04-30 11:16:04
回答 1查看 121关注 0票数 0

我试图预测一个模拟的估计完成时间。我在模拟开始时使用startTime。在每个周期结束时,我选择timeNow。经过的时间timeLapsed是通过减去这两个值来计算的。平均循环时间(每个周期不同)是通过将经过的时间除以当时的循环数,即在此之前运行的周期数来计算的。然后,通过将仍然要去的循环数乘以timeNow的平均周期时间,计算出估计的完成时间timeNow

我认为数据转换有问题,因为estimEndTime计算是不正确的。它的预测太短了/太快了。平均循环时间avgCycleTime计算在30-50秒左右,这看起来是正确的.循环试验nr为20。

我收到一个警告,将循环号(int )从int64转换为long,可能会丢失数据,但由于avgCycleTime似乎没有问题,这似乎不是导致错误的原因。

为什么这个不行?

代码要点:

代码语言:javascript
运行
AI代码解释
复制
long avgCycleTime;

DateTime startTime = DateTime::Now;

f1->textBox9->Text = startTime.ToString("dd/MM/yy  HH:mm:ss");
f1->textBox9->Update();

i = 0;  // cycle counter
while (i < nCycl)
{

    // this is where the simulation occurs

    i++;

    DateTime timeNow = DateTime::Now;
    TimeSpan timeLapsed = timeNow.Subtract(startTime);
    avgCycleTime = (timeLapsed.Ticks / i);
    DateTime estimEndTime = timeNow.AddTicks(avgCycleTime * (nCycl-i));

    f1->textBox10->Text = Convert::ToString(avgCycleTime / 10000000); // cycle time in milliseconds
    f1->textBox11->Text = estimEndTime.ToString("dd/MM/yy  HH:mm:ss");
    f1->Refresh();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 12:01:17

问题在于,您将avgCycleTime声明为long --实际上是Int32。假设一个周期需要50秒。在滴答声中,这将是50 * 10,000,000 = 500,000,000 --非常适合于Int32。然后计算avgCycleTime * (nCycl - i)并将其溢出(结果为Int32),从而得到无效的estimEndTime。因此,您必须声明avgCycleTimelong longInt64

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23396285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档