Java - PHP Number-Type Mix Up (9966006699) - PullRequest
       26

Java - PHP Number-Type Mix Up (9966006699)

2 голосов
/ 05 ноября 2011

Я делал кое-что с палиндромами:

Это число 9966006699 доставляло мне проблемы.Это продукт 99979 и 99681

99979 * 99681 = 9966006699

Я запустил это в PHP

$i = 99979 * 99681;
echo $i;
var_dump($i);

Выходы

9966006699 float(9966006699)

Так что в PHPproduct, очевидно, является типом данных с плавающей точкой.Но в 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 дает правильную вещь

Я заблудился, почему Java выдает неправильный вывод?и имеет ли это какое-либо отношение к E9 вещам за типами float и double?Помогите.Спасибо

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Integer.MAX_VALUE равно 2 ^ 31-1, что меньше, чем число, с которым вы имеете дело, поэтому вы, по сути, получаете проблемы с целочисленным переполнением.Вы можете обойти это, используя long или BigInteger класс.

Вы можете прочитать о числовых пределах примитивных типов данных здесь:

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

2 голосов
/ 05 ноября 2011

Это выглядит как целочисленное переполнение как 9 966 006 699 > Integer.MAX_INT = 2 147 483 647. Поскольку int times int имеют тип int, результат переполняется. Затем он приводится к int / float / long и т. Д.

Это должно быть правильно (для не-int):

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

Альтернативно вы можете использовать BigInteger класс, который:

  1. Может быть медленнее с использованием int / long
  2. У этой проблемы нет никаких чисел (long просто перемещает задачу с 2^31 - 1 на 2^63-1).
2 голосов
/ 05 ноября 2011

Числа 99979 и 99681 являются целыми числами.Поэтому выражение умножения также является выражением int.Максимальное значение выражения int равно 2147 ...... Ваше значение 9966006699 намного выше этого.Следовательно, вы попали в сферу странного поведения, которое вы получаете по модулю арифметики.(То есть, вы стали жертвой проблемы Y2K для языков семейства C).

Попробуйте:

       long o = (long)99979 * 99681;
       System.out.println(o);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...