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);\nRun 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);\nRun 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是一种有损操作,如果客户在从doubleto转换后看到这样的奇怪行为TimeSpan并希望得到准确的结果,那么我就可以原谅我。
我不一定认为这是“正确”的决定;显然,这种方法本身就会造成一些混乱。我只是说需要以某种方式做出决定,而这显然是已经决定的。
\n| 归档时间: |
|
| 查看次数: |
5878 次 |
| 最近记录: |