C#中int数组转整数时Lambda函数返回错误结果的原因
问题原因及解决办法
核心问题:整数溢出
C#里的int是32位有符号整数,最大值仅为2147483647,而你要计算的目标值9876543210远大于这个上限。用int存储计算结果时会触发整数溢出,溢出后数值会按补码规则循环,最终得到错误的1286608618。
当数组长度为9时,最大结果是987654321,刚好小于2147483647,所以能正常运行;添加第10位元素后数值超出int范围,就出现了错误。
另外你代码里用Math.Pow(浮点运算)转int还存在潜在精度问题——比如Math.Pow(10,9)理论值是1000000000,但浮点运算可能产生微小误差,转int时可能导致数值偏差。
解决办法
方法1:改用long类型存储结果
long是64位有符号整数,最大值为9223372036854775807,完全能容纳9876543210。同时建议用纯整数运算避免浮点误差:
int[] digits = new int[] { 9,8,7,6,5,4,3,2,1,0 }; // 更稳妥的整数累加方式 long bignumber = 0; foreach (int digit in digits) { bignumber = bignumber * 10 + digit; }
方法2:超大型数值用BigInteger
如果数组长度超过19位(超出long范围),可以用System.Numerics.BigInteger处理任意大小的整数:
using System.Numerics; int[] digits = new int[] { 9,8,7,6,5,4,3,2,1,0,9,8,7 }; string numStr = string.Join("", digits); BigInteger bigNumber = BigInteger.Parse(numStr);
内容的提问来源于stack exchange,提问作者sibeyzoran
相关产品推荐
相关产品推荐

