我正在尝试用Java做以下数学公式:
(44334*(220*220))+ (81744*220) + 39416)
当我在WolframAlpha(或谷歌)中输入相同的等式时,我得到:
2163788696
在java中我得到负数..
我一直在努力找出原因,但没有运气。 我也尝试在BigInteger中保存答案,但后来我得到负值,因为数字太大了。
我该怎么办?
答案 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用于确定+
含义的“规则”大致如下:
+
表示字符串连接。+
表示数字加法。此处的另一个问题是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