如果我在数组中有int.MaxValue,则数组的平均值将失败

时间:2012-10-19 01:04:24

标签: c#

我定义了以下计算数组平均值的方法:

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;


        }

2 个答案:

答案 0 :(得分: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 (请参阅维基百科上的Two's complement更多信息):

Correct sum:  2147483650
 Actual sum: -2147483646

实际总和是错误的,所以当你将它除以2时,你也会得到错误的平均值。垃圾进去,垃圾出来!

要解决此问题,请将Sum的返回类型更改为long,并将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方法返回正确的总和:int.MaxValue + 3小于long.MaxValue,因此不会发生溢出。

答案 1 :(得分: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;
}