- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近在 .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/
我最近在 .NET TimeSpan 实现中遇到了一些奇怪的行为。 TimeSpan test = TimeSpan.FromMilliseconds(0.5); double ms = test.T
C# WPF 应用程序 我有一个 SplashScreen通过使用在启动时显示最短时间 Thread.Sleep(int); //int = milliseconds to display splas
我是一名优秀的程序员,十分优秀!