.NET AddDays issue

本文关键字:issue AddDays NET | 更新日期: 2023-09-27 18:27:50

接下来的两行将相同的金额添加到相同的日期,结果日期部分是相同的,但不知何故时间部分有所不同!

(new DateTime(2000,1,3,18,0,0)).AddDays(4535);   
(new DateTime(2000,1,3,18,0,0)).AddMonths(149);

你会得到15秒的差距,而且两者都至少是四舍五入到天,我不知道为什么会发生这种情况,但它只发生在AddDays,而不是AddMonths(即使添加了数千个月)


编辑1

所以我试着做了一个样本项目,但没有成功。如果我运行我的主项目,并将采样线放入手表中,那么我会得到两个单独的值,如果我重新开始,问题就不存在了。该项目是3.5,c#,vs2010,win7hp x64(proj:x86)。我正试图在一个新的小项目中复制它,如果我有它,我会回信的。

这些是我在主要项目中的结果(copeid来自手表!):

(new DateTime(2000, 1, 3, 18, 0, 0)).AddDays(4535).Ticks    
 634743432153600000 long
(new DateTime(2000, 1, 3, 18, 0, 0)).AddMonths(149).Ticks   
 634743432000000000 long

编辑2

我已经设法把范围缩小得更窄了。我们有一个自制的组件,面板底座,我们用directx绘制。如果我让visible=false,比visible=true,比vissible=true(或show())之前出现的错误,则计算是正确的。世界上可能存在的是,结果得到了一个不使用变量的公式的其他东西。组件中的区域性不受影响。。

.NET AddDays issue

这里他们给出了相同的结果:

var d1 = (new DateTime(2000, 1, 3, 18, 0, 0)).AddDays(4535).Ticks;
var d2 = (new DateTime(2000, 1, 3, 18, 0, 0)).AddMonths(149).Ticks;

d1==d2==634743432000000000

(Tick是DateTime的内部时间"量子"。它很短。它是一秒的千万分之一

我要补充的是,即使是Mono(.NET的独立实现)也会给出相同的结果http://ideone.com/krySY(Ideone使用单声道)

考虑到你最近写的东西,这很容易:内存损坏。内存损坏会造成非常随机的事情。这可能是其中之一:-)

这是DirectX静默地将CPU的浮点计算模式更改为始终使用单精度的结果。这有时是为了性能:使用单精度可能比使用双精度快得多。有关DirectX CreateFlags枚举,请参阅MSDN文档中对FpuPreserve标志的描述。

其他人之所以无法复制这一点,是因为他们没有执行DirectX调用。

AddDays的自变量是double。该值乘以比例因子,得到以毫秒为单位的时间。正是这种计算产生了误差。

考虑:

double value = 4535;
int scale = 86400000;
long milliseconds = (long) ((value * scale) + ((value >= 0.0) ? 0.5 : -0.5));
long milliseconds2 = (long)((float)(value * scale) + ((value >= 0.0) ? 0.5 : -0.5));
Console.WriteLine(milliseconds2 - milliseconds);

milliseconds2的表达式包含对float的强制转换,它模仿DirectX强制单精度计算的效果。这将打印15360,正是您发现的差异。

相比之下,AddMonths采用整数,并且不使用任何浮点运算。所以结果是准确的。