.NET 框架 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
),但我在那里得到了一个例外。这是因为 .NET Reflector 检查的 Average 扩展方法的实现(在我的机器上)是:
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 相关联)。
但我仍然想知道是否有一个非常直接的实现来计算整数的平均值而无需外部库。你碰巧知道这样的实现吗?
谢谢!!
更新:
前面的三个大整数的例子只是说明溢出问题的一个例子。问题是关于计算任何一组数字的平均值,这些数字总和可能超过类型的最大值。对这种混乱感到抱歉。我还更改了问题的标题以避免额外的混乱。
谢谢大家!!