为什么AddMilliseconds围绕double参数?

时间:2010-04-22 10:43:06

标签: c# datetime rounding

DateTime.Now.AddMilliseconds(1.5); // adds 2 milliseconds

他们到底在想什么?如果它不处理小数值,那么创建一个采用double的方法会让我感到非常糟糕。他们为什么不通过调用AddTicks实现这一点并正确处理分数?或者至少采用一个int,这样对调用者来说是透明的吗?

我猜他们必须有一个很好的理由让他们以这种方式实现它,但我想不出它会是什么。任何人都可以提供任何见解吗?

编辑:只是为了进一步强调这一点:

AddSeconds(1.5); // Adds 1500 milliseconds

4 个答案:

答案 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)

DateTimeTimeSpan做了一些舍入。但是知道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无法解决任何小于毫秒的问题,因此添加小数毫秒也是不对的。

我会说他们已经做出了妥协 - 然后抛出异常会更好,并且会像大多数程序员所期望的那样工作。

相关问题