我最近在.net timespan实现中遇到了一些奇怪的行为.
TimeSpan test = TimeSpan.FromMilliseconds(0.5);
double ms = test.TotalMilliseconds; // Returns 0
Run Code Online (Sandbox Code Playgroud)
FromMilliseconds采用double作为参数.但是,似乎内部的值是四舍五入的.
如果我使用5000个滴答(.5毫秒)实例化新的时间跨度,则TotalMilliseconds的值是正确的.
查看反射器中的TimeSpan实现会发现输入实际上已经转换为long.
为什么Microsoft设计FromMilliseconds方法采用double参数而不是long(因为在实现时,double值是无用的)?
Han*_*ant 25
第一个考虑是想知道为什么他们选择双倍作为返回值.使用long将是一个明显的选择.虽然已经存在很长的完美特性,但Ticks是100纳秒的明确单位.但他们选择了两倍,可能是为了返回一个小数值.
然而,这产生了一个新问题,可能只是稍后才发现.双倍只能存储15位有效数字.TimeSpan可以存储10,000年.这是非常需要从时间跨度转换成毫秒,然后再返回到时间跨度,并得到相同的值.
这是不可能的双倍.算一算:10000年约为10000 x 365.4 x 24 x 3600 x 1000 = 315,705,600,000,000毫秒.计算15位数,最好是双倍数,你得到的最小单位只有一毫秒,仍然可以存储而没有舍入错误.任何额外的数字都是随机噪音.
设计师(测试人员?)被困在岩石和坚硬的地方之间,在从TimeSpan转换为毫秒时,必须选择舍入值.或者稍后从毫秒到TimeSpan.他们选择早做,做出勇敢的决定.
通过使用Ticks属性并乘以1E-4来获得毫秒来解决您的问题.
归档时间: |
|
查看次数: |
4242 次 |
最近记录: |