我在这里打的东西很奇怪,但我不确定是不是我知道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
是否考虑毫秒精度?
答案 0 :(得分:4)
TimeSpan
只是舍去传递它的毫秒数,因此123.33
和123.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);
现在您的程序会生成True
(demo)。
答案 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