-1

我在这个小片段上遇到了一个奇怪的错误:

private int CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return Math.Abs((int)difference.TotalSeconds);
}

就我而言,我计算的总秒数相差 3520789176.4909997 秒。该程序抛出了一个我在十年的 C# 编码中从未见过的异常​​:

System.OverflowException: "Negating the minimum value of a twos complement number is invalid."

我很确定它与浮点运算有关,但我不了解细节,我只需要一个足够的解决方案来确定两个日期值的差异。

4

2 回答 2

6

问题在于,当 a double 超出可以用 an 表示的值范围时,int-2,147,483,6482,147,483,647,根据 C# 规范,结果是未定义的(参见下面的Jeppe Stig Nielsen的评论),但在.NET 实现是int.MinValue. 因此,当您转换difference为时int,它会采用 -2,147,483,648 的值,然后无法使用Math.Abs

如果您将此方法转换为使用long,它应该可以工作:

private long CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return Math.Abs((long)difference.TotalSeconds);
}

int您也可以通过在获取绝对值后简单地转换为来解决此问题:

private int CalculateDifference(DateTime date1, DateTime date2)
{
    var difference = date1 - date2;
    return (int)Math.Abs(difference.TotalSeconds);
}
于 2013-07-26T11:54:07.287 回答
0

根据msdn: Int.Maxvalue 的值为 2,147,483,647

你的数字似乎比这更大。

于 2013-07-26T11:55:47.177 回答