Java - PHP数字类型混合(9966006699)

时间:2011-11-05 10:03:06

标签: java php types numbers primitive

我正在做一些关于回文的事情:

这个号码9966006699给了我一些问题。它是9997999681

的产物
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东西有什么关系吗?救命。感谢

3 个答案:

答案 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,它小于你正在处理的数字,所以你基本上会遇到整数溢出问题。您可以使用longBigInteger类来解决此问题。

您可以在此处阅读原始数据类型的数字限制:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 2 :(得分:2)

看起来整数溢出为9 966 006 699 > Integer.MAX_INT = 2 147 483 647。由于intint的类型为int,结果会溢出。然后它被转换为int / float / long等。

这应该是正确的(对于非int):

long value = (long)99979 * (long)99681

另外,您可以使用BigInteger类:

  1. 使用int / long
  2. 可能会慢一些
  3. 对于任何数字都没有此问题(long只是将问题从2^31 - 1移到2^63-1)。