3

我正在尝试在 Java 中做以下数学方程式:

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

当我在 WolframAlpha(或 Google)中输入相同的方程时,我得到:

2163788696

在java中我得到负数..

我一直在努力找出为什么会这样,但没有运气。我还尝试将答案保存在 BigInteger 中,但由于数字太大,我得到了负值。

我该怎么办?

4

6 回答 6

6

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

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

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

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

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

于 2012-12-30T21:57:53.787 回答
2

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

于 2012-12-30T21:58:48.597 回答
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铸造。使用longs 因为你的结果大于MAX_INT(但小于MAX_LONGwhich is 9223372036854775807)。

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

或者将后缀放在L您的数字之后(因此它们被视为longs)。

于 2012-12-30T21:59:58.160 回答
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用来判断其含义的“规则”+大致如下:

  • 如果左右操作数的类型是字符串,则+表示字符串连接。
  • 如果左右操作数的类型都是原始数字类型或数字包装类型+表示数字加法。
  • 否则这是一个编译错误。

这里的另一个问题2163788696是大于int最大值 - 2147483647。所以要得到正确的答案(没有溢出),你需要告诉 Java 使用long算术;例如

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

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

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

于 2012-12-30T22:01:40.143 回答
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
于 2012-12-30T22:09:31.837 回答
0

只需在你写的每个数字后加上一个 L。

(44334L*(220L*220L))+ (81744L*220L) + 39416L
于 2012-12-30T22:16:16.397 回答