【问题标题】:TimeSpan Bug ..?时间跨度错误..?
【发布时间】:2014-02-23 20:11:26
【问题描述】:

具有相同数量的 tikcs 的 TimeSpan 怎么可能给出不同的 TotalDays 值?以下是我在运行我的应用程序后在调试器上看到的内容。

Ticks: 25920000000000
TotalDays: 30.0

当我在同一个地方点击断点时,再点击几下后,值看起来像这样:

Ticks: 25920000000000
TotalDays: 29.999999999999996

因为我后来使用了总天数,所以一次它是 30 天,另一次是 29 天,因为“相同”的 TimeSpan Ticks ?!

这仅发生在我的 Corei7 (win7 x64) 工作站上的 .NET 3.5 框架配置上的“AnyCpu”上(在 x86 上总是 30,在其他 3 个工作站上也没有出现 29)。有任何想法吗?

【问题讨论】:

  • 在写问题的标题时尽量具体。
  • 您使用的是 Direct3D 吗?浮点精度可以在运行时修改。看到这个question

标签: c# .net visual-studio-2010 .net-3.5 timespan


【解决方案1】:

嗯,它是双精度的(所以当你得到 TotalDays 值时,会有一个从 long -Ticks- 到 double 的转换),所以你可能有浮点精度“问题”。

如果你想要一个 int,请使用 TimeSpan.Days

TotalDays 是一个只读属性,类似于

return (double) this._ticks * (0.0 / 1.0);

(其中_ticks 很长)

Days 也是只读属性:

return (int) (this._ticks / 864000000000L);

【讨论】:

  • TimeSpan.Days 虽然如您所说,只会给出整数天数......并且在 OP 的问题中,第一个将返回 30,但第二个将返回 29。跨度>
  • @ChrisHammond Days 不只是“将 TotalDays 转换为 int”
  • 您应该从您的答案中删除return (double) this._ticks * (0.0 / 1.0);。那显然每次都会返回零。正确的代码是return (double)this._ticks * DaysPerTick;,其中DaysPerTick 被声明为private const double DaysPerTick = 1.1574074074074074E-12;
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
相关资源
最近更新 更多