-1

この小さなスニペットで奇妙なエラーが発生します。

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

私の場合、合計 3520789176.4909997 秒の差を計算しています。このプログラムは、10 年間の C# コーディングで見たことのない例外をスローします。

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

浮動小数点演算に関連していると確信していますが、詳細を理解していないため、2 つの日付値の違いを判断するのに十分なソリューションが必要です。

4

2 に答える 2

6

int問題は、 a doubleが-2,147,483,648から2,147,483,647で表現できる値の範囲を超えると、結果は C# 仕様に従って未定義になることです (以下のJeppe Stig Nielsenのコメントを参照)。 .NET 実装はint.MinValue. したがって、に変換するdifferenceint、値 -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 に答える