DateTime.Now.AddMilliseconds(1.5); // adds 2 milliseconds
他们到底在想什么?如果它不处理小数值,那么创建一个采用double的方法会让我感到非常糟糕。他们为什么不通过调用AddTicks实现这一点并正确处理分数?或者至少采用一个int,这样对调用者来说是透明的吗?
我猜他们必须有一个很好的理由让他们以这种方式实现它,但我想不出它会是什么。任何人都可以提供任何见解吗?
编辑:只是为了进一步强调这一点:
AddSeconds(1.5); // Adds 1500 milliseconds
答案 0 :(得分:4)
这是妥协,而不是完全不合理的妥协。传递的参数已经被舍入以处理DateTime的分辨率。舍入精确到刻度(100纳秒)是一个问题。 Double没有足够的有效数字,无法涵盖所有可能的日期。 10000年x 365 x 24 x 3600 x 1000 x 10000 = 3E18,double只有15位有效数字。通过四舍五入到毫秒没有问题,3E14 只是足够好(赔率是多少?)
解决方法很简单,只需使用AddTicks(1.5 * 10000)。
答案 1 :(得分:2)
看起来确实很奇怪。我唯一的想法是,也许他们觉得最好转到最接近的毫秒,而不是冒险将调用者截断为一个双精度到int。是的,这是一个相当微弱的解释。遗憾。
答案 2 :(得分:1)
DateTime
和TimeSpan
做了一些舍入。但是知道Ticks是100ns间隔你可以解决这个问题:
var now = DateTime.Now;
var result = now + TimeSpan.FromTicks(10000 * 1.5);
(1ms内有10,000个100ns间隔。)
编辑:更正了这一点,DateTime存储* 100 * ns内部计数(不是10ns)。
答案 3 :(得分:-1)
来自MSDN:
在将毫秒值添加到指定的DateTime之前,将毫秒值四舍五入为最接近的整数。
由于DateTime
无法解决任何小于毫秒的问题,因此添加小数毫秒也是不对的。
我会说他们已经做出了妥协 - 然后抛出异常会更好,并且会像大多数程序员所期望的那样工作。