TimeSpan FromMilliseconds奇怪的实现?

DEH*_*AAS 27 .net c# timespan

我最近在.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来获得毫秒来解决您的问题.