Арифметические операции | Документация AnyLogic
Java поддерживает следующие арифметические операции:
Оператор | Операция |
---|---|
+ | Сложение |
— | Вычитание |
* | Умножение |
/ | Деление |
% | Остаток от целочисленного деления |
Приоритет операций умножения и деления выше, чем у сложения и вычитания. Операции с одинаковыми приоритетами выполняются слева направо. Вы можете изменять порядок выполнения операций с помощью скобок:
a + b / c ≡ a + ( b / c ) a * b — c ≡ ( a * b ) — c a / b / c ≡ ( a / b ) / c
Рекомендуется всегда явно задавать порядок выполнения операций с помощью скобок — в этом случае вам не придется думать о том, приоритет какой операции выше.
Стоит уделить особое внимание целочисленному делению.
Результат деления в Java зависит от типов операндов. Если оба операнда — целые числа, то результат будет тоже целым. Поэтому непреднамеренное использование целочисленного деления может привести к существенной потере точности. Чтобы произвести обычное деление, получив в качестве результата вещественное значение, в Java нужно явно указать, что хотя бы один из операндов является вещественным числом.
Например:
3 / 2 ≡ 1 2 / 3 ≡ 0
потому что это целочисленное деление. Однако
3 / 2. ≡ 1.5 2.0 / 3 ≡ 0.66666666…
потому что 2. и 2.0 являются вещественными числами. Если k и n являются переменными типа int, то k/n будет производить целочисленное деление и выдавать в качестве результата целое число (значение типа int). Чтобы получить вещественный результат при делении двух целочисленных переменных (или выражений), вы должны заставить Java рассматривать хотя бы одну переменную как вещественную.
Целочисленное деление часто используется вместе с операцией взятия остатка от деления для получения номера строки и столбца элемента по его порядковому номеру. Предположим, что есть коллекция из 600 элементов, задающая, скажем, места в театре, и мы хотим условно расположить эти места в 20 рядов, каждый из которых содержит по 30 мест. В этом случае получить номер ряда и номер места в этом ряду можно будет с помощью следующих выражений:
Номер места: index % 30 (остаток от деления индекса на 30: 0 — 29)
Номер ряда: index / 30 (целочисленное деление индекса на 30: 0 — 19)
где порядковый номер (индекс) index принимает значения от 0 до 599. Например, место с индексом 247 будет соответствовать месту 7 в ряду 8. b, то это будет означать операцию побитового ИЛИ). Чтобы выполнить возведение в степень, нужно вызвать функцию pow():
pow( a, b ) ≡ ab
Java поддерживает несколько упрощенных операторов для часто используемых операций с численными переменными:
i++ ≡ i = i + 1 (увеличение значения i на 1)
i— ≡ i = i — 1 (уменьшение значения i на 1)
a += 100.0 ≡ a = a + 100.0 (увеличение значения a на 100.0)
b -= 14 ≡ b = b — 14 (уменьшение значения b на 14)
Обратите внимание, что хотя такие операторы могут использоваться в выражениях, их вычисление изменяет значение операндов.
Как мы можем улучшить эту статью?
Циклы while и for . Объектно-ориентированное программирование на Java. Платформа Java SE
Давайте представим, что мы хотим разделить целое число m на другое целое число n.
И мы хотим получить результат целочисленного деления, то есть самое большое количество раз, которое n вписывается в m.
Например, целочисленное деление 7 на 2, равно 3, потому что 2 по 3 раза, это 6.
Остаток равен 1.
И представьте себе, что у нас нет встроенной операции, которая выполняет эту операцию для нас.
Поэтому нам нужно сделать повторяемые вычитания.
И если нам удастся вычесть 2 из 7 три раза, это означает, что целочисленное деление равно 3.
Целочисленное деление y и целочисленный остаток x соответствуют формуле, m равно y умножить на n плюс x.
Предположим, что нам даны целые числа m и n.
А в x сохраняется оставшееся значение после вычитаний.
Итак, давайте начнем с x равно m.
y содержит результат целочисленного деления.
Мы инициализируем y 0 и приращиваем y на 1 каждый раз, когда мы вычитаем n из x.
И мы продолжаем вычитать n из x, пока x не меньше n.
Если x больше или равно n, мы вычитаем n из x и увеличим y на 1.
Таким образом, эта программа делает то, что мы хотим, но тут есть проблема.
Мы не знаем, сколько операторов if мы должны добавить.
Потому что это зависит от фактических значений m и n.
Например, с 7 и 2, это будет три выражения if.
При других входных данных это должно быть другое число if выражений.
В Java эту проблему решает оператор while.
Теперь эта программа делает то же самое, что и прежде, повторяет выражение, пока выполняется условие.
Но теперь у нас есть одно большое преимущество.
Выражения повторяются столько раз, сколько это необходимо, автоматически.
Но теперь вы должны быть очень осторожны при написании условия while.
Потому что есть опасность войти в бесконечный цикл, если условие while никогда не прекратится.
Преимущество цикла while заключается в том, что нам не нужно заранее знать, сколько раз мы должны что-либо повторять.
Мы повторяем, пока не будет достигнута цель, выраженная логическим условием.
Иногда, однако, мы знаем, сколько раз нам нужно что-либо повторить.
Это легко реализовать подсчетом.
Хитрость заключается в том, чтобы ввести счетчик.
Это целочисленная переменная, которую мы обновляем на каждой итерации.
Здесь существует три важных элемента: величина, с которой мы хотим начать, значение в конце и шаг между значениями.
Здесь мы начинаем с 0 и заканчиваем 3. И шаг 1.
Поэтому мы выполняем четыре итерации для i равного 0, 1, 2 и 3.
Теперь, помимо подсчета, мы можем захотеть что-то сделать в теле цикла.
В этом случае предположим, что у нас есть другая переменная, n, которую мы хотим умножать на 2 при каждой итерации.
Так как такого рода подсчет используется часто, в Java для этого есть специальная конструкция.
А именно, цикл for.
Этот цикл объединяет три важных момента для переменной счетчика:
Ее инициализацию, условие остановки, и выражение обновления.
Имейте в виду, что обновление выполняется после того, как выполняется тело цикла, а не раньше.
Для цикла for скобки являются обязательными, а также две точки с запятой внутри.
Фигурные скобки необходимы только в том случае, если есть более одного выражения в теле цикла.
Но это хорошая практика, чтобы всегда писать их.
Как вы видели, если в начальный момент условное выражение, управляющее циклом while, ложно, тело цикла вообще не будет выполняться.
Однако иногда желательно выполнить тело цикла хотя бы один раз, даже если в начальный момент условное выражение ложно.
Иначе говоря, существуют ситуации, когда проверку условия прерывания цикла желательно выполнять в конце цикла, а не в его начале.
И в Java есть именно такой цикл: do-while.
Этот цикл всегда выполняет тело цикла хотя бы один раз, так как его условное выражение проверяется в конце цикла.
В приведенном примере тело цикла выполняется до первой проверки условия завершения.
Мы уже видели оператор break в выражении switch.
Но оператор break также может прерывать любой цикл.
Предположим, у вас есть цикл.
И иногда желательно немедленно завершить цикл, не проверяя условие.
В таких случаях используется оператор break.
Оператор break немедленно завершает цикл, и управление программой переходит к следующему выражению, следующему за циклом.
Оператор break почти всегда используется вместе с выражением if else.
Также иногда желательно не прервать цикл, а пропустить код тела цикла и перейти к следующей итерации.
Оператор continue пропускает текущую итерацию цикла и когда выполняется оператор continue, управление программой переходит к концу цикла.
Затем проверяется условие, которое управляет циклом.
Оператор continue также почти всегда используется вместе с выражением if else.
Данный текст является ознакомительным фрагментом.
Целочисленное деление и модуль — Основы программирования
Кеннет Лерой БасбиОбзор
В целочисленном делении и по модулю делимое делится на делитель на целое частное и остаток. Операция целочисленного частного называется целочисленным делением, а операция целочисленного остатка — модулем. [1] [2]
Обсуждение
К тому времени, когда мы достигаем совершеннолетия, мы обычно думаем о делении как о результате результата, который может иметь дробную часть (тип данных с плавающей запятой). Этот тип деления известен как деление с плавающей запятой. Однако деление, когда оба операнда имеют целочисленный тип данных, может действовать по-разному, в зависимости от языка программирования, и называется: целочисленное деление . Рассмотрим:
11 / 4
Поскольку оба операнда имеют целочисленный тип данных, оценка выражения (или ответа) будет равна 2 без дробной части (оно отбрасывается). Опять же, этот тип деления называется целочисленное деление , и это то, чему вы научились в начальной школе, когда впервые узнали о делении.
Целочисленное деление, как учили в начальной школе.
В реальном мире манипулирования данными есть вещи, которые всегда обрабатываются целыми единицами или числами (целочисленный тип данных). Фракций просто не существует. Чтобы проиллюстрировать наш пример: у меня есть 11 долларовых монет, которые нужно раздать поровну моим 4 детям. Сколько получит каждый? Ответ: 2, при этом у меня еще осталось 3 (или еще 3 в руке). Ответ не 2 ¾ на каждого или 2,75 на каждого ребенка. Долларовые монеты не делятся на дробные части. Не пытайтесь мыслить нестандартно и притворяться пиратом. Используя топор, разрубите 3 оставшиеся монеты на части по восемь штук. Затем, давая каждому ребенку по 2 монеты и 6 штук по восемь, или 2 6/8, или 2 ¾, или 2,75. Если вы действительно так думаете, я поменяю свой пример на банки томатного супа. Я предлагаю вам попробовать нарезать три банки супа и дать каждому ребенку по ¾ банки. Еще лучше, живые существа, такие как щенки. После того, как вы разделите их топором, большинство детей не захотят ¾ собаки.
Что такое модуль ? Это другая часть ответа для целочисленного деления. Это остаток. Помните, в начальной школе вы говорили: «Одиннадцать разделить на четыре равно двум остатку три». Во многих языках программирования символом оператора модуля является знак процента (%).
11 % 4
Таким образом, ответ или значение этого выражения равно 3 или остатку целочисленного деления.
Многие компиляторы требуют, чтобы у вас были целочисленные операнды с обеих сторон оператора модуля, иначе вы получите ошибку компилятора. Другими словами, нет смысла использовать оператор модуля с операндами с плавающей запятой.
Пусть вас не смущают следующие предметы.
6 / 24 отличается от 6 % 24
Сколько раз можно разделить 24 на 6? Шесть разделить на 24 равно нулю. Это отличается от: Какой остаток от деления 6 на 24? Шесть, остальная часть дается по модулю.
Вычислите следующие выражения деления:
- 14/4
- 5 / 13
- 7/2,0
Оцените следующие выражения модуля:
- 14 % 4
- 5 % 13
- 7 % 2,0
Основные термины
- целочисленное деление
- Деление без дробных частей.
- модуль
- Остаток от целочисленного деления.
Ссылки
- cnx.org: Основы программирования — модульный структурированный подход с использованием C++
- Википедия: Деление (математика) ↵
- Википедия: Операция по модулю ↵
NUM02-J. Убедитесь, что операции деления и остатка не приводят к ошибкам деления на ноль — SEI CERT Oracle Coding Standard for Java
Перейти к концу метаданных
Операции деления и остатка, выполняемые над целыми числами, подвержены ошибкам деления на ноль. Следовательно, делитель в операции деления или остатка над целочисленными типами должен быть проверен на ноль перед операцией. Это правило не распространяется на операции деления и остатка, выполняемые над числами с плавающей запятой.
Пример кода несоответствия (деление)
Результатом операции /
является частное от деления первого арифметического операнда на второй арифметический операнд. Операции деления подвержены ошибкам деления на ноль. Переполнение также может произойти во время деления целого числа со знаком с дополнением до двух, когда делимое равно минимальному (отрицательному) значению для целочисленного типа со знаком, а делитель равен -1 (дополнительную информацию см. в разделе NUM00-J. Обнаружение или предотвращение переполнения целых чисел). ). Этот несоответствующий пример кода может привести к ошибке деления на ноль при делении операндов со знаком
число1
и число2
:
длинное число1, число2, результат; /* Инициализировать num1 и num2 */ результат = число1 / число2;
Совместимое решение (подразделение)
Это совместимое решение проверяет делитель, чтобы гарантировать отсутствие вероятности ошибок деления на ноль:
long num1, num2, result; /* Инициализировать num1 и num2 */ если (число2 == 0) { // Обработка ошибки } еще { результат = число1 / число2; }
Пример кода несоответствия (оставшаяся часть)
%
оператор дает остаток при делении двух операндов целочисленного типа. Этот несоответствующий пример кода может привести к ошибке деления на ноль во время операции остатка над операндами со знаком
num1
и num2
:
long num1, num2, result; /* Инициализировать num1 и num2 */ результат = число1 % число2;
Соответствующее решение (остаток)
Это совместимое решение проверяет делитель, чтобы гарантировать отсутствие вероятности ошибки деления на ноль:
длинное число1, число2, результат; /* Инициализировать num1 и num2 */ если (число2 == 0) { // Обработка ошибки } еще { результат = число1 % число2; }
Оценка риска
Деление или остаток на ноль может привести к аварийному завершению программы и отказу в обслуживании (DoS).
Правило | 9 | 9000 3 9000.![]() 9000. 9016. 9000. 9000. | 6.6.0003Priority | Level | |||
---|---|---|---|---|---|---|---|
NUM02-J | Low | Likely | Medium | P6 | L2 | Автоматическое обнаружение0234 7.5DIVIDE_BY_ZERO | Implemented |
Parasoft Jtest | 2022.1 | CERT.NUM02.ZERO | Avoid division by zero | ||||
PVS-Studio | 7.21 | V6020 | | ||||
SonarQube | 6.7 | S3518 |
Дополнительные рекомендации
Стандарт кодирования SEI CERT C | INT33-C. |