为什么TimeSpan.FromSeconds(double)舍入到毫秒?

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)

Gol*_*rol 11

正如您自己发现的那样,这是一个记录在案的功能.它在TimeSpan文档中有所描述:

参数

value类型:System.Double

几秒钟,精确到最接近的毫秒.

造成这种情况的原因可能是因为双重根本不准确.在比较双打时进行一些舍入总是一个好主意,因为它可能只是比你期望的更大或更小.当你试图输入整整毫秒时,这种行为实际上可以为你提供一些意想不到的纳秒.我认为这就是他们选择将值四舍五入到整数毫秒并丢弃较小数字的原因.


alp*_*use 7

关于炒作的权利..

  1. TimeSpan.MaxValue.TotalMilliseconds 等于922337203685477.该数字有15位数.
  2. double 精确到15位数.
  3. TimeSpan.FromSeconds,TimeSpan.FromMinutes等所有经过转换以表示毫秒double(当时蜱然后TimeSpan这是不是有趣,现在)

因此,当您创建TimeSpan接近TimeSpan.MaxValue(或MinValue)时,转换将精确到毫秒.
因此,"为什么"这个问题的可能答案是:始终具有相同的精度. 需要考虑的另一件事是,如果通过首先将值转换为表示的滴答来完成转换,那么工作是否可以做得更好.
long


Dan*_*Tao 6

假设您是负责设计该TimeSpan类型的开发人员。您已具备所有基本功能;一切似乎都很顺利。然后有一天,一位 Beta 测试人员出现并向您展示了这段代码:

\n\n
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),但您必须承认从客户的角度来看,这确实有点奇怪。然后他向你扔了这个:

\n\n
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测试人员的怀疑是可以理解的。

\n\n

此时您需要做出决定。您可以允许TimeSpan在从值构造的值之间进行算术运算,以产生精度超过类型本身精度的double结果\xe2\x80\x94例如,100000000000000.5(16位有效数字)\xe2\x80\x94或你知道,你可以不允许这样做。double

\n\n

所以你决定,你知道吗,我将这样做,以便任何使用 adouble构造 a 的方法TimeSpan都将四舍五入到最接近的毫秒。这样,就明确记录了从 a 转换double为 aTimeSpan是一种有损操作,如果客户在从doubleto转换后看到这样的奇怪行为TimeSpan并希望得到准确的结果,那么我就可以原谅我。

\n\n

我不一定认为这是“正确”的决定;显然,这种方法本身就会造成一些混乱。我只是说需要以某种方式做出决定,而这显然是已经决定的。

\n