2015-05-01 3 views
1
System.out.println(1000*16777216/4890); 

ВЫВОД:-82342Почему «x * y/z» приводит к неправильному отрицательному значению?

... но должно быть: 3430923

Как я могу это исправить?

+5

Это положительное переполнение целочисленного значения, которое является результатом использования вашей математики 'long' вместо этого. –

ответ

4

Просто добавьте L в 1000 или 16777216 (или оба) ... и это сделает трюк.

Причины, как Rod_Algonquin заявил, что это положительного переполнения целочисленного значения, и это происходит, когда вы умножаете 1000 на 16777216; что в конечном итоге будет больше (максимально допустимый) Integer.MAX_VALUE, поэтому он обертывается и начинается с Integer.MIN_VALUE (в вашем случае значение будет -402653184; разделите его на 4890, и вы получите неожиданный результат -82342).

Посмотрите (обратите внимание на желтый выделен раздел, IDEA предупредит вас с Числовой переполнения в выражении):

enter image description here

+0

Возможно, правильно, но ОП, вероятно, не имеет понятия, почему. –

+0

спасибо за объяснение, я думал, что может быть переполнение, но я не понял отрицательный результат –

1

Как было отмечено @Rod_Algonquin, 1000*16777216 превышает range из int (int принимает значение от -2 до 2 - 1), поэтому он вызывает переполнение.

Для того, чтобы предотвратить переполнение произошло, вы можете выполнять вычисления с использованием long добавлением буквы L после числа литералов, как следующее:

1000L * 16777216/4890 

По умолчанию 1000 является int буквальным в Java, тогда как 1000L является литералом long.

1

Прежде всего обратите внимание, что это целое число арифметика. Независимо от того, какой промежуточный расчет будет храниться как целое. 1000*16777216 даст 16777216000, который выходит за пределы целого числа. Так что теперь система пытается справиться с этим число над потоком в течение runtime.As 16777216000>Integer.MAX_VALUE и теперь он движется к отрицательным варьировались значения для обработки переполнения ..

Попробуйте как этот Integer.MAX_VALUE + 1 даст вам -2147483648 .Better способ управления это использовать примитив long или вы можете использовать double для значения с плавающей запятой.

Смежные вопросы