Операция взятия остатка от деления в Java
Я уже однажды расписывал операции в Java. В этой статье я акцентрирую внимание на операцию взятия остатка от деления, так как её работа отличается в различных языках программирования и иногда порождает недопонимание.
Операция взятия остатка % в Java работает не только с целыми числами, но и с числами с плавающей точкой.
Для целых чисел операция взятия остатка работает по такому принципу, что результат операции будет таким, что будет выполняться равенство:
Это равенство действует даже в том случае, если левый операнд будет наименьшим отрицательным числом для своего типа, а операнд в правой части будет равен -1 (тогда результатом будет 0).
Результатом операции взятия остатка для целых чисел в Java может быть отрицательное число только в том случае, если левый операнд будет отрицательным числом, а также результат может быть положительным только в том случае, если операнд в левой части будет положительным числом.
Если в правой части операции взятия остатка для целочисленных операндов в Java стоит 0, то результатом будет ArithmeticException .
Примеры работы операции взятия остатка для целочисленных операндов (выполнено в JShell):
Как я уже говорил, в Java операция взятия остатка % работает и с числами с плавающей точкой ( float и double ). Согласно спецификации языка Java операция взятия остатка для чисел с плавающей точкой работает не так, как это принято в IEEE 754, но если очень нужно то можно использовать метод Math . IEEEremainder .
В Java операция взятия остатка % работает согласно следующим правилам:
- Если один из операндов равен NaN, то результат операции будет NaN.
- Если результат не NaN, то знаком результата будет знак операнда в левой части.
- Если операнд в левой части Infinity, или операнд в правой части равен нулю, или выполняются оба условия, то результат будет равен операнду в левой части.
- Если операнд в левой части конечен, а операнд в правой части Infinity, то результат будет равен операнду в левой части.
- Если операнд в левой части равен нулю, а операнд в правой части конечен, то результат будет равен операнду в левой части.
- Во всех остальных случаях результат r взятия остатка от операнда n при делении на d определяется по математической формуле r = n — (d × q), где q будет целым числом, которое отрицательно только в случае, если n / d отрицательно, и положительно, если n / d положительно, и его размер максимально возможный, но не превышающий отношение n и d. Пример: 0,5 ÷ 0,3 = 1,6, тогда q будет положительным, так как 1,6 положительно, а наибольший размер, не превышающий 1,6 будет 1, то q = 1, а значит r = 0,5 — (0,3 × 1) = 0,2.
Операция взятия остатка для чисел с плавающей точкой никогда не приводит к возникновению Exception-ов.
Примеры операции взятия остатка для чисел с плавающей точкой:
Вычисляем проценты и
остаток от деления нацело
Во многих приложениях есть скидки — столько-то процентов на тот или иной товар. Поэтому программисты должны уметь запрограммировать взятие процента — просто умножить на число процентов и поделить на 100. Но не стоит путать оператор % и взятие процента. Исторически сложилось, что символ % обозначает в Java остаток от деления нацело.
Когда вам нужно посчитать процент от заданного числа, то нужно умножить это число на количество процентов и поделить на 100. Аналогичный способ – умножить число на ноль запятая количество процентов. Проценты часто используются, чтобы рассчитать значения цены со скидкой или когда вам известна пропорция — сколько A составляет от B в процентах.
Пример. Обычная цена товара составляет 4000 руб, но сейчас действует скидка 15 процентов. Выведите на экран сумму со скидкой:
// не забываем о коварстве деления нацело и пишем 15.0, // а не просто 15 - см. предыдущую тему System.out.println (4000*15.0/100); // это будет 15% от исходной величины - 600 рублей System.out.println (4000*0.15); // это то же самое // Теперь сама новая цена - это старая минус сумма скидки: System.out.println (4000 - 4000*0.15); // Аналогично мы можем писать и с помощью переменных double price = 4000; // исходная цена - могла быть прочитана из файла или базы данных double discount_percent = 15; // величина скидки в процентах double discount_value = price * discount_percent / 100; // величина скидки в рублях double new_price = price - discount_value; // новая цена за вычетом скидки
Не стоит путать оператор % и взятие процента. Исторически сложилось, что символ % обозначает в Java вычисление остатка от деления нацело.
/* Посчитаем остаток от деления 100 на 10. Делится нацело, поэтому остаток – ноль*/ int s = 100%10; // 100 не делится нацело на 11 – в остатке остаётся 1 s = 101%10; // s равно 1 s = 102%10 // s равно 2 s = 119%10 // s равно 9 s = 120%10 // s равно 0, деление нацело, то есть остатка нет
В программировании часто используется остаток от деления, чтобы описать циклически меняющуюся величину. Дело в том, что если исходная величина все время возрастает, то остаток от деления на постоянную величину будет расти, но затем пойдет снова с нуля. Посмотрим в коде, заодно вспомним оператор инкремента ++ (увеличить переменную на 1):
int a = 3; System.out.println ( a % 3); // распечатать остаток от деления a на 3. Сейчас он равен нулю. a ++; // означает "увеличить a на 1, эквивалентно a += 1 . Теперь a стало равно 4 System.out.println ( a % 3); // распечатать остаток от деления a на 3. Сейчас это 1. a ++; // а равно 5 System.out.println ( a % 3); // остаток 2 a ++; // а равно 6 System.out.println ( a % 3); // остаток 0 a ++; // а равно 7 System.out.println ( a % 3); // остаток 1 // Как видно, выражение a%3 все время пробегает повторяющийся набор значений: // 0, 1, 2, 0, 1, 2, 0, 1, 2 и так далее.
Как видите, мы все время повторяли команды a++ и распечатка a%3. Чтобы не писать один и тот же код много раз применяют циклы, они позволяют запускать кусок кода много раз подряд. Но о циклах в следующих разделах, а пока мы поняли, что % — остаток от деления одного числа на другое бывает полезен, чтобы сформировать последовательность чисел от нуля до заданного числа, повторяющуюся подряд нужное число раз. Такие последовательности бывают нужны в самых разных задачах, например, когда вы хотите задать координаты персонажам в игре и расставить их по экрану — каждый следующий правее, и так до конца экрана, а потом снова слева направо уже по следующей строчке.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Оператор деления по модулю
Оператор деления по модулю — оператор mod , обозначается символом % . Этот оператор возвращает остаток от деления первого операнда на второй. Оператор mod » % » в Java работает не только с целыми (такие как: byte/int/short/long ), но и с плавающей точкой (такие как: float/double ) числами\типами. Приведенная ниже программа иллюстрирует работу этого оператора:
package com.l2cccp.work; public class Mod < public static void main(String args[]) < int i = 17; // Целые double d = 17.3; // С плавающей точкой System.out.println("i mod 10 = " + i % 10); System.out.println("d mod 10 lang-java line-numbers"> i mod 10 = 7 d mod 10 = 7.300000000000001
package com.l2cccp.work; public class Mod < public static void main(String args[]) < int[] day= new int[] < 1, 2, 5 >; System.out.println("Вы играете уже " + day[0] + " " + declension(day[0])); System.out.println("Вы играете уже " + day[1] + " " + declension(day[1])); System.out.println("Вы играете уже " + day[2] + " " + declension(day[2])); > public static String declension(int count) < String one = "день"; String two = "дня"; String five = "дней"; if(count >100) count %= 100; if(count > 20) count %= 10; switch(count) < case 1: return one; case 2: case 3: case 4: return two; default: return five; >> >
Вы играете уже 1 день Вы играете уже 2 дня Вы играете уже 5 дней
- Вы играете уже 1 день и 1 час.
- Вы играете уже 2 дня и 4 часа.
- Вы играете уже 5 дней 9 часов.
package com.l2cccp.work; public class Mod < public static void main(String args[]) < int[] day = new int[] < 1, 2, 5 >; int[] hour = new int[] < 1, 4, 9 >; System.out.println("Вы играете уже " + day[0] + " " + declension(day[0], "Days") + " и " + hour[0] + " " + declension(hour[0], "Hour")); System.out.println("Вы играете уже " + day[1] + " " + declension(day[1], "Days") + " и " + hour[1] + " " + declension(hour[1], "Hour")); System.out.println("Вы играете уже " + day[2] + " " + declension(day[2], "Days") + " и " + hour[2] + " " + declension(hour[2], "Hour")); > public static String declension(int count, String type) < String one = ""; String two = ""; String five = ""; if(type.equals("Days")) < one = "день"; two = "дня"; five = "дней"; >else if(type.equals("Hour")) < one = "час"; two = "часа"; five = "часов"; >if(count > 100) count %= 100; if(count > 20) count %= 10; switch(count) < case 1: return one; case 2: case 3: case 4: return two; default: return five; >> >
Вы играете уже 1 день и 1 час Вы играете уже 2 дня и 4 часа Вы играете уже 5 дней и 9 часов
Что означает знак процента% в Java?
Программирование и разработка
В Java есть несколько арифметических операторов, таких как +, -, / и так далее. Другой полезный арифметический оператор в java — это %, который делит два значения и, следовательно, возвращает оставшуюся часть этих значений. В Java есть несколько вариантов использования %, например, его можно использовать для проверки того, является ли число четным или нечетным, его можно использовать для проверки, является ли число палиндромом или нет, и так далее.
Что означает % в Java
Знак % означает модуль, и в java он используется для получения остатка от двух значений, или, точнее, мы можем сказать, что знак % возвращает остаток от операции деления. Есть несколько названий % sing, таких как модуль, по модулю, остаток.
Базовый синтаксис
Синтаксис модуля (%) показан в приведенном ниже фрагменте:
Здесь, в приведенном выше фрагменте, Number1 — делимое, а Number2 — делитель.
Как использовать оператор % в Java
Давайте рассмотрим несколько примеров, чтобы понять, как использовать знак % в java, изначально мы рассмотрим несколько базовых примеров, а постепенно перейдем к некоторым продвинутым примерам:
В этом примере мы берем два целочисленных значения и применяем к ним оператор модуля:
publicclassModulusExample <
publicstaticvoidmain ( String [ ] args ) <
int number1 = 13 ;
int number2 = 3 ;
System . out . println ( «Remainder: « + ( number1 % number2 ) ) ;
>
>
В приведенном выше фрагменте мы берем два целочисленных значения и применяем к ним оператор %, и, следовательно, он возвращает следующий результат:
Из вывода видно, что оператор % выполняет деление заданных значений и в результате возвращает их остаток.
Давайте рассмотрим еще один пример, чтобы проверить, является ли введенное пользователем число четным или нечетным:
publicclassModulusExample <
publicstaticvoidmain ( String [ ] args ) <
int number, result ;
Scanner scan = new Scanner ( System . in ) ;
System . out . print ( «Enter a number: « ) ;
number = scan. nextInt ( ) ;
if ( number % 2 == 0 )
<
System . out . println ( «You entered an even number» ) ;
>
else
<
System . out . println ( «You entered an odd number» ) ;
>
>
>
В этом примере мы принимаем ввод от пользователя и выполняем над ним оператор %, если остаток равен «0», тогда он покажет «Вы ввели четное число», иначе он покажет «Вы ввели нечетное число» :
Пользователь вводит «11», следовательно, мы получаем «Вы ввели нечетное число», что подтверждает работу оператора модуля (%).
Заключение
В Java знак % делит два числа и, следовательно, возвращает остаток от этих значений. Оператор % относится к категории арифметических операторов и очень удобен при выполнении математических операций, таких как определение четности числа или нечетности, отслеживание следующего индекса следующей точки в циклическом массиве и т. д. В этой статье представлено всестороннее понимание того, что означает %, его основной синтаксис и как его использовать в java.