我正在做一些关于回文的事情:
这个号码9966006699
给了我一些问题。它是99979
和99681
99979 * 99681 = 9966006699
我在PHP
$i = 99979 * 99681;
echo $i;
var_dump($i);
输出
9966006699 float(9966006699)
因此在PHP中,产品显然是一种浮点数据类型。但在Java中,它有所不同,如下所示:
此
public static void main(String[] args) {
float f = 99979 * 99681;
System.out.println(f);
long o = 99979 * 99681;
System.out.println(o);
double d = 99979 * 99681;
System.out.println(d);
int i = 99979 * 99681;
System.out.println(i);
}
输出
1.37607206E9
1376072107
1.376072107E9
1376072107
Google的计算器会显示right thing
我迷路了,为什么Java输错了?它与float和double类型后面的E9
东西有什么关系吗?救命。感谢
答案 0 :(得分:2)
数字99979和99681都是int' s。因此乘法表达式也是一个int表达式。 int表达式的最大值是2147 ......您的值9966006699高于该值。因此,你已经陷入了从模数运算中得到的奇怪行为的范畴。 (也就是说,你已成为C系列语言和Y2K问题版本的牺牲品。)
试试这个:
long o = (long)99979 * 99681;
System.out.println(o);
答案 1 :(得分:2)
Integer.MAX_VALUE
等于2 ^ 31-1,它小于你正在处理的数字,所以你基本上会遇到整数溢出问题。您可以使用long
或BigInteger
类来解决此问题。
您可以在此处阅读原始数据类型的数字限制:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 2 :(得分:2)
看起来整数溢出为9 966 006 699 > Integer.MAX_INT = 2 147 483 647
。由于int
次int
的类型为int
,结果会溢出。然后它被转换为int / float / long等。
这应该是正确的(对于非int):
long value = (long)99979 * (long)99681
另外,您可以使用BigInteger
类:
int
/ long
long
只是将问题从2^31 - 1
移到2^63-1
)。