我定义了以下计算数组平均值的方法:
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;
}
答案 0 :(得分:2)
在Sum
方法中,int
数据类型不足以容纳int.MaxValue / 2
和int.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;
}