我正在尝试在Java中执行以下数学方程:
(44334*(220*220))+ (81744*220) + 39416)
当我在WolframAlpha(或谷歌)输入相同的等式时,我得到的结果是:
2163788696
在Java中我得到了负数。
我一直努力找出这是为什么,但没有成功。
我还尝试用BigInteger保存答案,但由于数字太大,结果变成了负值。
我应该怎么办?
编辑:为了处理整数溢出问题,请使用long
:
System.out.println("Result: " +
(44334L * 220 * 220 + 81744 * 220 + 39416)); // 2163788696
(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
类型,因为你的结果大于MAX_INT
(但小于MAX_LONG
,即9223372036854775807
)。
(long)((long)44334*220*220 + (long)81744*220 + 39416)
L
(这样它们就被视为long
)。+
运算符被重载了。它既可以表示字符串连接,也可以表示数字相加。问题是有些+
操作被视为字符串连接而不是数值相加。System.out.println("result="+((44334*(220*220))+ (81744*220) + 39416));
或者使用一个临时变量。
int res = (44334*(220*220))+ (81744*220) + 39416;
System.out.println("result="+res);
+
含义的“规则”大致如下:
+
表示字符串连接。+
表示数字相加。2163788696
大于最大的int
值- 2147483647
。因此,为了得到正确的答案(避免溢出),您需要告诉Java使用long
算术;例如:System.out.println("result=" + ((44334L * (220 * 220)) + (81744 * 220) + 39416));
result
将是一个负数...就像这个例子一样。BigInteger
,但它有点繁琐,而long
在这里完全足够了。MAX_INT
。;-) - mbinettelong
行吗?但我不确定你是否还需要转换中间结果。 - OneMore对于 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
(long)((long)44334*220*220+ (long)81744*220 + 39416)
- mbinette