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 (有关更多信息,请参阅 Wikipedia 上的二进制补码):

Correct sum:  2147483650
 Actual sum: -2147483646

实际总和是错误的,因此当您将其除以 2 时,您也会得到错误的平均值。垃圾进垃圾出!

要解决此问题,请将的返回类型更改Sumlong,并将total变量的类型也更改long为:

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

现在该Sum方法返回正确的 sum: int.MaxValue + 3is less than 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 回答