我试图创建一个将值转换为位的程序。一切都运行良好,直到我达到GB(千兆字节)。因此,例如1 GB应该等于80亿位,但结果给了我一个否定的答案。这是我的代码可以有人给我一些见解吗?
else if(line.equals("GB")) {
Scanner num = new Scanner(System.in);
System.out.println("How many GigaBytes are you transfering to bits?");
int number = num.nextInt();
//int ans = number * 8 * 1000000000;
BigInteger bigAns = BigInteger.valueOf(number * 8 * 1000000000);
System.out.println(number + " GigaByte(s) equals " + bigAns + " bits.");
}
以下是我得到的输出:1 GigaByte(s)等于-589934592位。
答案 0 :(得分:4)
在整个计算过程中使用BigInteger
并不是一件坏事。这样,在乘以这些数字时,不会冒溢出的风险。
BigInteger bigAns = BigInteger.valueOf(number).multiply(BigInteger.valueOf(8))
.multiply(BigInteger.valueOf(1000000000L));
答案 1 :(得分:2)
您收到一个负数,因为您超出了有符号32位整数的最大可能值并导致溢出。
当处理这样的大数字时,你应该使用long
代替,它能够容纳更大的数字。
要实现此目的,请将int ans = number * 8 * 1000000000
更改为long ans = number * 8 * 1000000000l
答案 2 :(得分:0)
你得到的答案是垃圾值。 您可以通过执行以下操作将int转换为BigInteger:
BigInteger bi = BigInteger.valueOf(myInteger.intValue());
正如Bohsulav所说:
您可以使用此号码* 8 * 1000000000l来防止溢出。
帮助了?让我知道:)
答案 3 :(得分:0)
首先转换为biginteger 然后执行计算。
BigInteger.valueOf(number * 8 * 1000000000);
在这里,你在int中执行计算,然后转换为BigInteger ,当它为时已晚。
使用BigInteger.valueOf(number),然后调用适当的方法来执行计算。