数组转int整数时超9位出现异常值的问题求助
问题原因与解决方案
为什么会得到错误结果1410065407?
Java里的int是32位有符号整数,它的取值范围是 -2147483648 到 2147483647(也就是 -2^31 到 2^31-1)。你要转换的9999999999已经远大于2147483647,在循环计算过程中,number的值会超出int能容纳的最大值,触发整数溢出。
Java对整数溢出的处理是按补码规则循环的,溢出后的值会绕回到int范围的最小值重新计算,最终就得到了1410065407这个看似无厘头的结果。
解决办法
根据你的需求,有三种常用的修复方式:
1. 使用更大范围的整数类型long
long是64位有符号整数,取值范围是 -9223372036854775808 到 9223372036854775807,足够容纳10个9的数字(9999999999是10位,远小于long的最大值)。修改代码如下:
public class YourClassNameHere{ public static void main(String[] args){ long number = 0; // 把int改成long int[] num = {9,9,9,9,9,9,9,9,9,9,9}; for(int i=0; i<num.length; i++){ number = number*10 + num[i]; } System.out.println(number); } }
2. 用BigInteger处理超大数字
如果你的数组长度超过18位(比如20个9),long也会溢出,这时候可以用Java提供的java.math.BigInteger类,它能处理任意大小的整数:
import java.math.BigInteger; public class YourClassNameHere{ public static void main(String[] args){ BigInteger number = BigInteger.ZERO; int[] num = {9,9,9,9,9,9,9,9,9,9,9}; for(int digit : num){ number = number.multiply(BigInteger.TEN).add(BigInteger.valueOf(digit)); } System.out.println(number); } }
3. 直接拼接成字符串(简单无溢出)
如果只是需要输出这个数字,直接把数组里的数字拼接成字符串是最省心的方式,完全不会有溢出问题:
public class YourClassNameHere{ public static void main(String[] args){ int[] num = {9,9,9,9,9,9,9,9,9,9,9}; StringBuilder sb = new StringBuilder(); for(int digit : num){ sb.append(digit); } System.out.println(sb.toString()); } }
内容的提问来源于stack exchange,提问作者Mohit Yadav
相关产品推荐
相关产品推荐

