System.out.println(1000*16777216/4890);
ВЫВОД:-82342
Почему «x * y/z» приводит к неправильному отрицательному значению?
... но должно быть: 3430923
Как я могу это исправить?
System.out.println(1000*16777216/4890);
ВЫВОД:-82342
Почему «x * y/z» приводит к неправильному отрицательному значению?
... но должно быть: 3430923
Как я могу это исправить?
Просто добавьте L
в 1000
или 16777216
(или оба) ... и это сделает трюк.
Причины, как Rod_Algonquin заявил, что это положительного переполнения целочисленного значения, и это происходит, когда вы умножаете 1000
на 16777216
; что в конечном итоге будет больше (максимально допустимый) Integer.MAX_VALUE
, поэтому он обертывается и начинается с Integer.MIN_VALUE
(в вашем случае значение будет -402653184
; разделите его на 4890
, и вы получите неожиданный результат -82342
).
Посмотрите (обратите внимание на желтый выделен раздел, IDEA предупредит вас с Числовой переполнения в выражении):
Возможно, правильно, но ОП, вероятно, не имеет понятия, почему. –
спасибо за объяснение, я думал, что может быть переполнение, но я не понял отрицательный результат –
Как было отмечено @Rod_Algonquin, 1000*16777216
превышает range из int
(int
принимает значение от -2 до 2 - 1), поэтому он вызывает переполнение.
Для того, чтобы предотвратить переполнение произошло, вы можете выполнять вычисления с использованием long
добавлением буквы L
после числа литералов, как следующее:
1000L * 16777216/4890
По умолчанию 1000
является int
буквальным в Java, тогда как 1000L
является литералом long
.
Прежде всего обратите внимание, что это целое число арифметика. Независимо от того, какой промежуточный расчет будет храниться как целое. 1000*16777216
даст 16777216000
, который выходит за пределы целого числа. Так что теперь система пытается справиться с этим число над потоком в течение runtime.As 16777216000
>
Integer.MAX_VALUE
и теперь он движется к отрицательным варьировались значения для обработки переполнения ..
Попробуйте как этот Integer.MAX_VALUE + 1
даст вам -2147483648
.Better способ управления это использовать примитив long
или вы можете использовать double
для значения с плавающей запятой.
Это положительное переполнение целочисленного значения, которое является результатом использования вашей математики 'long' вместо этого. –