gpt4 book ai didi

c# - TimeSpan FromMilliseconds 奇怪的实现?

转载 作者:IT王子 更新时间:2023-10-29 04:16:55 30 4
gpt4 key购买 nike

我最近在 .NET TimeSpan 实现中遇到了一些奇怪的行为。

TimeSpan test = TimeSpan.FromMilliseconds(0.5);
double ms = test.TotalMilliseconds; // Returns 0

FromMilliseconds 采用 double 作为参数。但是,该值似乎在内部四舍五入。

如果我用 5000 个滴答(.5 毫秒)实例化一个新的 TimeSpan,则 TotalMilliseconds 的值是正确的。

查看反射器中的 TimeSpan 实现表明输入实际上被转换为 long。

为什么 Microsoft 将 FromMilliseconds 方法设计为采用 double 参数而不是长参数(因为对于此实现, double 值毫无用处)?

最佳答案

首先要考虑的是他们为什么选择一个 double 作为返回值。使用 long 将是一个显而易见的选择。虽然已经有一个完美的 long 属性,但 Ticks 以 100 纳秒为单位是没有歧义的。但他们选择了 double,可能是为了返回一个分数值。

然而,这产生了一个新问题,这个问题可能是后来才发现的。 double 只能存储 15 位有效数字。一个 TimeSpan 可以存储 10,000 年。 非常希望将 TimeSpan 转换为毫秒,然后再转换回 TimeSpan 并获得相同的值。

用 double 是不可能的。计算一下:10,000 年大约是 10000 x 365.4 x 24 x 3600 x 1000 = 315,705,600,000,000 毫秒。算出 15 位数字,最好是 double ,您将得到 正好 1 毫秒作为仍然可以无舍入误差存储的最小单位。任何额外的数字都是随机噪声。

进退两难,设计人员(测试人员?)不得不在从 TimeSpan 转换为毫秒时对值进行四舍五入之间做出选择。或者在从毫秒到 TimeSpan 时稍后再做。他们选择早做,这是一个勇敢的决定。

通过使用 Ticks 属性并乘以 1E-4 得到毫秒来解决你的问题。

关于c# - TimeSpan FromMilliseconds 奇怪的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450439/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com