【发布时间】:2017-01-11 02:44:54
【问题描述】:
我在 java 中乘以 2 非常大的数字,但乘法输出似乎有点奇怪
代码
long a = 2539586720l;
long b = 77284752003l;
a*=b;
System.out.println(a);
a=(long)1e12;
b=(long)1e12;
a*=b;
System.out.println(a);
输出:
-6642854965492867616
2003764205206896640
在第一种情况下,为什么结果是负数,如果是因为溢出,那么为什么第二个结果是正数?请解释这种行为? Code
Edit:
我正在使用mod=100000000009 操作仍然是负面的?
a = ((a%mod)*(b%mod))%mod
【问题讨论】:
-
这可能是由于截断,因为结果无法存储在
long中。如果long还不够。尝试使用BigInteger -
@redflar3 这不是问题,主要问题是为什么
negative在第一种情况下,而positive在第二种情况下 -
long 最多可以容纳 (2^63-1 即 9e18),因为您的第一次乘法结果超过 1e20。这会导致截断,因此结果不正确。同样,第二个结果也被截断,因为它应该是 1e24。因此使用 BigInteger
-
@redflar3 那就是我想了解为什么 java 会出现这样的行为,两者都应该是
-ve
标签: java multiplication