Java:大整数错误

时间:2012-12-30 21:55:46

标签: java numbers integer

我正在尝试用Java做以下数学公式:

(44334*(220*220))+ (81744*220) + 39416)

当我在WolframAlpha(或谷歌)中输入相同的等式时,我得到:

2163788696

在java中我得到负数..

我一直在努力找出原因,但没有运气。 我也尝试在BigInteger中保存答案,但后来我得到负值,因为数字太大了。

我该怎么办?

6 个答案:

答案 0 :(得分:6)

编辑:要处理整数环绕,请使用long

System.out.println("Result: " +
    (44334L * 220 * 220 + 81744 * 220 + 39416));  // 2163788696

plus运算符是左关联的(无论它是用于字符串连接还是添加),所以如果整个算术表达式没有括号,它会将子表达式的结果连接成从左到左的单个字符串右。

左操作数确定+是否用于字符串连接或添加。在这种情况下,第一个操作数是一个字符串,因此右侧((44334*(220*220)))也会转换为字符串。第一个+运算符的结果是一个字符串,并用作另一个+字符串连接操作的左侧。下一个操作数((81744*220))再次转换为字符串。

您可以在整个算术表达式周围加上括号以避免这种情况。

答案 1 :(得分:2)

问题是由于表达式是从左到右进行评估的。第一个值是string类型,因此+运算符然后变为字符串连接运算符而不是数学加法运算符。然后评估表达式(44334*(220*220))(81744*220)并将其转换为字符串,从而导致错误的结果。如果用括号括起整个表达式,则会正确计算结果并看到正确的结果。

答案 2 :(得分:2)

现在,你所做的相当于:

System.out.println(("result="+(44334*220*220)) + (81744*220 + 39416) );
// = "result=2145765600" + 18023096
// = "result=214576560018023096"

括号很重要!这是你修改的代码:

System.out.println("result=" + (44334*220*220+ 81744*220 + 39416) );
// = "result=2163788696"

修改

还要注意自动int施法。使用long,因为您的结果大于MAX_INT(但小于MAX_LONG的{​​{1}}。

9223372036854775807

或者在您的号码后加上后缀(long)((long)44334*220*220 + (long)81744*220 + 39416) (因此它们被视为L)。

答案 3 :(得分:1)

问题是Java中的+运算符是否过载。它可以表示字符串连接或数字加法。发生的事情是,一些+操作被视为字符串连接而不是数字添加。

您需要在表达式周围添加一组括号

System.out.println("result="+((44334*(220*220))+ (81744*220) + 39416)); 

或使用临时变量。

int res = (44334*(220*220))+ (81744*220) + 39416;
System.out.println("result="+res);

Java用于确定+含义的“规则”大致如下:

  • 如果左 OR 右操作数的类型是String,则+表示字符串连接。
  • 如果左 AND 右操作数的类型都是基本数字类型或数字包装类型,则+表示数字加法。
  • 否则这是编译错误。

此处的另一个问题是2163788696大于最大int值 - 2147483647。因此,要获得正确的答案(没有溢出),您需要告诉Java使用long算术; e.g。

System.out.println("result=" + ((44334L * (220 * 220)) + (81744 * 220) + 39416));

如果不这样做,那么result将是一个负数......在本例中。

您也可以使用BigInteger,但这有点麻烦,而long在这里也可以。

答案 4 :(得分:1)

对于BigInteger版本,试试这个,它会正常工作

BigInteger a = new BigInteger("44334").multiply(new BigInteger("220").multiply(new BigInteger("220")));
BigInteger b = new BigInteger("81744").multiply(new BigInteger("220"));
BigInteger c = new BigInteger("39416");
c = c.add(a).add(b);

System.out.println("resultVersA="+(44334*(220*220))+ (81744*220)  + 39416 );
System.out.println("resultVersB="+ c);

结果将是:

resultVersA=21457656001798368039416

resultVersB=2163788696

答案 5 :(得分:0)

在你写的每个号码后面加上一个L。

(44334L*(220L*220L))+ (81744L*220L) + 39416L