我正在尝试在 Java 中做以下数学方程式:
(44334*(220*220))+ (81744*220) + 39416)
当我在 WolframAlpha(或 Google)中输入相同的方程时,我得到:
2163788696
在java中我得到负数..
我一直在努力找出为什么会这样,但没有运气。我还尝试将答案保存在 BigInteger 中,但由于数字太大,我得到了负值。
我该怎么办?
编辑:要处理整数环绕,请使用long
:
System.out.println("Result: " +
(44334L * 220 * 220 + 81744 * 220 + 39416)); // 2163788696
加号运算符是左关联的(无论是用于字符串连接还是加法),所以如果整个算术表达式没有括起来,它会将子表达式的结果从左到右连接为单独的字符串。
左操作数确定 + 是用于字符串连接还是加法。在这种情况下,第一个操作数是一个字符串,所以右边的 ( (44334*(220*220))
) 也被转换为一个字符串。第一个 + 运算符的结果是一个字符串,并用作另一个 + 字符串连接操作的左侧。下一个操作数 ( (81744*220)
) 再次转换为字符串。
您可以在整个算术表达式周围加上括号以避免这种情况。
问题是由于表达式是从左到右计算的。第一个值是字符串类型,所以 + 运算符然后变成字符串连接运算符而不是数学加法运算符。(44334*(220*220))
然后对表达式(81744*220)
求值并将其转换为导致错误结果的字符串。如果将整个表达式用括号括起来,则结果会正确计算并且您会看到正确的结果。
现在,您所做的相当于:
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
s 因为你的结果大于MAX_INT
(但小于MAX_LONG
which is 9223372036854775807
)。
(long)((long)44334*220*220 + (long)81744*220 + 39416)
或者将后缀放在L
您的数字之后(因此它们被视为long
s)。
问题是+
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
在这里也可以。
对于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
只需在你写的每个数字后加上一个 L。
(44334L*(220L*220L))+ (81744L*220L) + 39416L