0

配列の平均を計算する次のメソッドを定義しました。

public int AverageOfArray (params int[] arr)
        {
            if (arr.Length > 0)
            {
                double avg = Sum(ints) / arr.Length;
                return (int)avg;
            }
            return 0;
        }

私の要件は、平均が整数として返されることです。int.MaxValue を使用してこのメ​​ソッドをテストしようとすると、単体テストが失敗します。テストクラスに合格するにはどうすればよいですか?

更新しました::-

public int Sum(params int[] arr)
        {
            int total = 0;

            for (int n = 0; n < arr.Length; n++)
            {
                total += arr[n];
            }

            return total;


        }
4

2 に答える 2

2

このSumメソッドでは、データ型がとintの合計を保持するのに十分ではありません:int.MaxValue / 2int.MaxValue / 2 + 4

     int.MaxValue / 2     = 0x3FFFFFFF
     int.MaxValue / 2 + 4 = 0x40000003
--------------------------------------
Sum: int.MaxValue - 1 + 4 = 0x80000002 (subtract 1 because int.MaxValue is odd)

正しい合計が を超えるためint.MaxValue、符号ビットにオーバーフローし、結果が正しい合計より 2 32少なくなります (詳細については、ウィキペディアの 2 の補数を参照してください)。

Correct sum:  2147483650
 Actual sum: -2147483646

実際の合計は間違っているため、2 で割ると平均も間違っています。ガベージイン、ガベージアウト!

この問題を解決するには、 の戻り値の型をSumに変更し、変数longの型も に変更します。totallong

public long Sum(params int[] arr)
{
    long total = 0;
    for (int n = 0; n < arr.Length; n++)
    {
        total += arr[n];
    }
    return total;
}

Sumメソッドは正しい合計を返すようになりました:はint.MaxValue + 3より小さいlong.MaxValueため、オーバーフローは発生しません。

于 2012-10-19T01:15:46.707 に答える
0

これはあなたのために働くはずです

public int AverageOfArray (params int[] arr)
{

    double avg = 0;

    if (arr.Length > 0)
    {
        for (int n = 0; n < arr.Length; n++)
        {
            avg += arr[n]/arr.Length;
        }

    }
    return (int)avg;
}
于 2012-10-19T01:23:00.237 に答える