DateTime.AddDays的准确度如何?

Kel*_*tex 2 c# datetime rounding

由于DateTime.AddDays()接受一个double参数,我担心当你添加一天时,可能会有一些舍入错误.例如,假设我有以下循环:

DateTime Now = DateTime.Today;
for (int i = 0; i < 365; ++i)
{
    Now = Now.AddDays(1);
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我担心现在可能会从午夜开始漂流.我总是想做一些这样的事情,这可能会慢一些,但我的偏执有些缓解:

for (int i = 0; i < 365; ++i)
{
    Now = Now.AddDays(1.01).Date;
    // do something
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 11

由于DateTime将日期内部存储为64位整数,其中一个刻度表示100纳秒,因此不存在错误风险.一天有864,000,000,000个刻度,Double精度至少为15位.因此,当舍入到滴答时,每个错误都会消失,因为Double如果1.0等于一天,则分辨率高于一个滴答.

这不是真的AddYears(),因为Double如果1.0等于一年,则没有足够的精度来表示一个刻度.但是如果你看一下这个DateTime类,你会发现设计遵循这个事实 - AddMonths()并且AddYears()同时具有整数和非浮点参数.

要检查这一点,只需执行以下代码即可.

DateTime now = DateTime.Now;

// Displays 864000000000 
Console.WriteLine(now.AddDays(1.0).Ticks - now.Ticks);
Run Code Online (Sandbox Code Playgroud)