TimeSpan与毫秒精度的比较

时间:2014-10-26 10:11:29

标签: c# time

我在这里打的东西很奇怪,但我不确定是不是我知道TimeSpan API错了。以下打印出false,我不确定原因:

var foo = TimeSpan.FromMilliseconds(123.34d);
var bar = TimeSpan.FromMilliseconds(123.33d);
Console.WriteLine(foo > bar);

以下打印true

var foo = TimeSpan.FromMilliseconds(123.34d);
var bar = TimeSpan.FromMilliseconds(123.33d);
Console.WriteLine(foo == bar);

在进行比较时,TimeSpan.FromMilliseconds是否考虑毫秒精度?

4 个答案:

答案 0 :(得分:4)

TimeSpan只是舍去传递它的毫秒数,因此123.33123.34最终表示123毫秒的时间跨度。 123.5将被舍入到123毫秒。

如果您需要更高的精确度,请自行计算滴答数:

var foo = TimeSpan.FromTicks((long)(123.34*TimeSpan.TicksPerMillisecond));
var bar = TimeSpan.FromTicks((long)(123.33*TimeSpan.TicksPerMillisecond));
Console.WriteLine(foo > bar);

现在您的程序会生成Truedemo)。

答案 1 :(得分:1)

根据API文档http://msdn.microsoft.com/en-us/library/system.timespan.frommilliseconds(v=vs.110).aspx,方法TimeSpan.FromMilliSeconds(double d)采用任意双倍值,但仅在逗号之后将值限制为最多一位数,因为双精度值在使用之前转换为刻度值TimeSpan结构

  

value参数转换为ticks,并且该ticks数用于初始化新的TimeSpan。因此,仅将值视为精确到最接近的毫秒。请注意,由于Double数据类型的精度损失,此转换可能会为接近但仍在MinValue或MaxValue范围内的值生成OverflowException。

该网站上的例子也强调了这一点:

  

GenTimeSpanFromMillisec(1);
          GenTimeSpanFromMillisec(1.5);
          GenTimeSpanFromMillisec(12345.6);
          GenTimeSpanFromMillisec(123456789.8);
          GenTimeSpanFromMillisec(1234567898765.4);
          GenTimeSpanFromMillisec(1000);
          GenTimeSpanFromMillisec(60000);
          GenTimeSpanFromMillisec(3600000);
          GenTimeSpanFromMillisec(86400000);
          GenTimeSpanFromMillisec(1801220200);

答案 2 :(得分:0)

Timespan接受浮点作为毫秒的参数,但忽略小数。

有道理,因为时间跨度没有亚毫秒的概念;它是最小的单位。

答案 3 :(得分:0)

这是一个精确的问题:

var fooba = TimeSpan.FromMilliseconds(123.36d);
var foob = TimeSpan.FromMilliseconds(123.35d);
var foo = TimeSpan.FromMilliseconds(123.34d);
var bar = TimeSpan.FromMilliseconds(123.33d);
Console.WriteLine(fooba + " > " + foob + "?: " + (fooba > foob));
Console.WriteLine(foob + " > " + foo + "?: " + (foob > foo));
Console.WriteLine(foo + " > " + bar + "?: " + (foo > bar));
Console.WriteLine(fooba + " == " + foob + "?: " + (fooba == foob));
Console.WriteLine(foob + " == " + foo + "?: " + (foob == foo));
Console.WriteLine(foo + " == " + bar + "?: " + (foo == bar));

00:00:00.1230000 > 00:00:00.1230000?: False
00:00:00.1230000 > 00:00:00.1230000?: False
00:00:00.1230000 > 00:00:00.1230000?: False
00:00:00.1230000 == 00:00:00.1230000?: True
00:00:00.1230000 == 00:00:00.1230000?: True
00:00:00.1230000 == 00:00:00.1230000?: True