Rom*_*kov 34 .net timespan base-class-library
TimeSpan.FromSeconds
需要一个双倍,并且可以表示低至100纳秒的值,但是这种方法莫名其妙地将时间四舍五入到整个毫秒.
鉴于我只花了半个小时来确定这个(记录在案的!)行为,知道为什么会出现这种情况会更容易忍受浪费的时间.
任何人都可以建议为什么这种看似适得其反的行为被实施了?
TimeSpan.FromSeconds(0.12345678).TotalSeconds
// 0.123
TimeSpan.FromTicks((long)(TimeSpan.TicksPerSecond * 0.12345678)).TotalSeconds
// 0.1234567
Run Code Online (Sandbox Code Playgroud)
关于炒作的权利..
TimeSpan.MaxValue.TotalMilliseconds
等于922337203685477.该数字有15位数.double
精确到15位数.TimeSpan.FromSeconds
,TimeSpan.FromMinutes
等所有经过转换以表示毫秒double
(当时蜱然后TimeSpan
这是不是有趣,现在)因此,当您创建TimeSpan
接近TimeSpan.MaxValue
(或MinValue
)时,转换将精确到毫秒.
因此,"为什么"这个问题的可能答案是:始终具有相同的精度.
需要考虑的另一件事是,如果通过首先将值转换为表示的滴答来完成转换,那么工作是否可以做得更好.long
假设您是负责设计该TimeSpan
类型的开发人员。您已具备所有基本功能;一切似乎都很顺利。然后有一天,一位 Beta 测试人员出现并向您展示了这段代码:
double x = 100000000000000;\ndouble y = 0.5;\nTimeSpan t1 = TimeSpan.FromMilliseconds(x + y);\nTimeSpan t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);\nConsole.WriteLine(t1 == t2);\n
Run Code Online (Sandbox Code Playgroud)\n\n为什么会这样输出False
?测试员问你。尽管您理解为什么会发生这种情况(将x
和相加时精度会降低y
),但您必须承认从客户的角度来看,这确实有点奇怪。然后他向你扔了这个:
x = 10.0;\ny = 0.5;\nt1 = TimeSpan.FromMilliseconds(x + y);\nt2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);\nConsole.WriteLine(t1 == t2);\n
Run Code Online (Sandbox Code Playgroud)\n\n那一个输出True
!测试人员的怀疑是可以理解的。
此时您需要做出决定。您可以允许TimeSpan
在从值构造的值之间进行算术运算,以产生精度超过类型本身精度的double
结果\xe2\x80\x94例如,100000000000000.5(16位有效数字)\xe2\x80\x94或你知道,你可以不允许这样做。double
所以你决定,你知道吗,我将这样做,以便任何使用 adouble
构造 a 的方法TimeSpan
都将四舍五入到最接近的毫秒。这样,就明确记录了从 a 转换double
为 aTimeSpan
是一种有损操作,如果客户在从double
to转换后看到这样的奇怪行为TimeSpan
并希望得到准确的结果,那么我就可以原谅我。
我不一定认为这是“正确”的决定;显然,这种方法本身就会造成一些混乱。我只是说需要以某种方式做出决定,而这显然是已经决定的。
\n 归档时间: |
|
查看次数: |
5878 次 |
最近记录: |