.NET Framework 3.5。
我正在尝试计算一些非常大的数字的平均值。
例如:
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var items = new long[]
{
long.MaxValue - 100,
long.MaxValue - 200,
long.MaxValue - 300
};
try
{
var avg = items.Average();
Console.WriteLine(avg);
}
catch (OverflowException ex)
{
Console.WriteLine("can't calculate that!");
}
Console.ReadLine();
}
}
显然,数学结果是9223372036854775607(
long.MaxValue - 200
),但我在那里遇到了异常。这是因为(在我的机器上)Average扩展方法的实现,由.NET Reflector检查如下:public static double Average(this IEnumerable<long> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
long num = 0L;
long num2 = 0L;
foreach (long num3 in source)
{
num += num3;
num2 += 1L;
}
if (num2 <= 0L)
{
throw Error.NoElements();
}
return (((double) num) / ((double) num2));
}
我知道我可以使用一个BigInt库(是的,我知道它在.NET Framework 4.0中包含,但我只能使用3.5版本)。
但我仍然想知道是否有一种相当简单的整数平均值计算实现,而不需要外部库。你知道这样的实现吗?
谢谢!
更新:
之前的示例仅是为了说明溢出问题。该问题是关于计算任何一组数字的平均数,这些数字可能相加得到一个超过类型最大值的大数字。对此混淆感到抱歉。我还更改了问题的标题以避免进一步的混淆。
感谢大家!
double
,为什么不在总和累加器中使用double
类型呢? 由于将long
截断为尾数宽度可能会导致一些小错误。 - ony