Mil*_*dák 4 .net c# linq math integer-overflow
我有一个高达2 000 000的素数列表.这是一个包含近15万个非常大的整数的列表.我想要一个所有数字的总和.这是一个随机的大整数列表,仅用于演示:
List<int> numbers = new List<int>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
Run Code Online (Sandbox Code Playgroud)
我得到一个"算术运算导致溢出"异常.我猜这个总和太大了,但将它转换为Int64并没有帮助,它仍然会抛出相同的异常.
Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());
Run Code Online (Sandbox Code Playgroud)
我甚至尝试将总和保存到Int64变量然后使用它,但这也不起作用.
long sum = numbers.Sum();
Console.WriteLine(sum.ToString());
Run Code Online (Sandbox Code Playgroud)
是否有任何数据类型可以容纳这么大的数字,或者我是否在其他地方犯了错误?谢谢你的帮助.
在获得总和之前尝试转换为Int64(长):
Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
Run Code Online (Sandbox Code Playgroud)
问题是您的答案超过26.5亿。更改int为Int64
List<Int64> numbers = new List<Int64>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
Run Code Online (Sandbox Code Playgroud)
澄清一个Int的最大价值约为26.5亿,而Int64的万亿
您可以使用Aggregate方法:
Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));
Run Code Online (Sandbox Code Playgroud)
Aggregate将累加器作为第一个参数
Literal 的重载0L将被视为long, not int。这将使您免于算术溢出