Перейти к содержимому

Как получить остаток от деления в java

  • автор:

Операция взятия остатка от деления в Java

Я уже однажды расписывал операции в Java. В этой статье я акцентрирую внимание на операцию взятия остатка от деления, так как её работа отличается в различных языках программирования и иногда порождает недопонимание.

Операция взятия остатка % в Java работает не только с целыми числами, но и с числами с плавающей точкой.

Для целых чисел операция взятия остатка работает по такому принципу, что результат операции будет таким, что будет выполняться равенство:

( a / b ) * b + ( a % b ) == a

Это равенство действует даже в том случае, если левый операнд будет наименьшим отрицательным числом для своего типа, а операнд в правой части будет равен -1 (тогда результатом будет 0).

Результатом операции взятия остатка для целых чисел в Java может быть отрицательное число только в том случае, если левый операнд будет отрицательным числом, а также результат может быть положительным только в том случае, если операнд в левой части будет положительным числом.

Если в правой части операции взятия остатка для целочисленных операндов в Java стоит 0, то результатом будет ArithmeticException .

Примеры работы операции взятия остатка для целочисленных операндов (выполнено в JShell):

| Welcome to JShell — Version 10.0.1
| For an introduction type : / help intro
jshell > 5 % 3
jshell > 5 / 3
jshell > 5 % ( — 3 )
jshell > 5 / ( — 3 )
jshell > ( — 5 ) % 3
jshell > ( — 5 ) / 3
jshell > ( — 5 ) % ( — 3 )
jshell > ( — 5 ) / ( — 3 )

Как я уже говорил, в 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-ов.

Примеры операции взятия остатка для чисел с плавающей точкой:

Оператор деления по модулю

Java-университет

Оператор деления по модулю - 1

Оператор деления по модулю — оператор 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 
  1. Вы играете уже 1 день.
  2. Вы играете уже 2 дня.
  3. Вы играете уже 5 дней.
 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 день и 1 час.
  2. Вы играете уже 2 дня и 4 часа.
  3. Вы играете уже 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 часов 

Так как наш метод описан как паблик " public " то вызвать его можно легко из любого пакета:

 Mod.declension(count, type); 

Собственно вот и все, надеюсь кому то это будет полезно. Удачи в освоении Java языка.

Java: Комбинирование операций и методов

Логические операции — это выражения. Значит, логические операции можно комбинировать с другими выражениями. Разберем на примере. Допустим, мы хотим проверить четность числа. В программировании четность проверяется через остаток от деления на 2:

  • Если остаток 0, то число было четным
  • Если остаток не 0, то число было нечетным

Остаток от деления — простая, но очень важная концепция в арифметике, алгебре, теории чисел и криптографии. Идея проста: нужно разделить число на несколько равных групп. Если в конце что-то останется, это и есть остаток от деления.

Делим конфеты поровну между людьми:

  • 7 конфет, 2 человека: 2 x 3 + остаток 1. Значит, 7 не кратно 2
  • 21 конфету, 3 человека: 3 x 7 + остаток 0. Значит, 21 кратно 3
  • 19 конфет, 5 человек: 5 x 3 + остаток 4. Значит, 19 не кратно 5

В коде остаток вычисляется с помощью оператора % :

  • 7 % 2 → 1
  • 21 % 3 → 0
  • 19 % 5 → 4

С помощью него напишем метод для проверки четности:

// Определен в классе App public static boolean isEven(int number) < return number % 2 == 0; >App.isEven(10); // true App.isEven(3); // false 

В одном выражении мы скомбинировали два логических оператора:

  • == — проверка равенства
  • % — арифметический оператор остатка от деления

Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение number % 2 , затем результат участвует в логическом сравнении.

По-русски это можно расшифровать так: «Нужно вычислить остаток от деления числа number на 2 и сравнить с нулем; затем вернуть результат сравнения».

Рассмотрим еще один пример. Напишем метод, который принимает строку и проверяет, заглавная ли первая буква. Алгоритм действий будет такой:

  1. Получим и запишем в переменную первый символ из строки-аргумента
  2. Сравним, равен ли символ своей заглавной версии
  3. Вернем результат

А так будет выглядеть реализация в коде:

public static boolean isFirstLetterInUpperCase(String string) < var firstLetter = string.charAt(0); // Класс Character содержит различные методы для работы с символом // Метод isUpperCase() проверяет, что переданный символ в верхнем регистре return Character.isUpperCase(firstLetter); >App.isFirstLetterInUpperCase("marmont"); // false App.isFirstLetterInUpperCase("Robb"); // true 

Задание

Реализуйте метод isInternationalPhone() , который проверяет формат указанного телефона. Если телефон начинается с +, значит это международный формат.

App.isInternationalPhone("89602223423"); // false App.isInternationalPhone("+79602223423"); // true 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Арифметические операторы

В следующей таблице перечислены основные арифметические операторы (или операции), применяемые в языке Java:

Операция Описание
+ Сложение (а также унарный плюс)
- Вычитание (а также унарный минус)
* Умножение
/ Деление
% Деление по модулю

Рассмотрим некоторые правила работы с арифметическими операторами:

  • Выражения вычисляются слева направо, если не добавлены круглые скобки или одни операции имеют более высокий приоритет.
  • Операции * , / , и % имеют более высокий приоритет чем + и - .

Арифметические операторы над целочисленными значениями

Например, в этом коде, переменные a и b будут иметь разные значения:

public class BasicIntMath < public static void main(String[] args) < int a = 4 + 5 - 2 * 3; int b = 4 + (5 - 2) * 3; System.out.println("a = " + a); System.out.println("b language-markup">a = 3 b = 13

Унарные операции сложения и вычитания

  • Операция унарного вычитания изменяет знак своего единственного операнда.
  • Операция унарного сложения просто возвращает значение своего операнда. Она в принципе не является необходимой, но возможна.
public class UnarySignOperation < public static void main(String[] args) < double a = -6; double b = +6; System.out.println(a); System.out.println(b); >>

Деление целочисленных чисел в Java

Когда операция деления выполняется над целочисленным типом данных, ее результат не будет содержать дробный компонент. Это деление без остатка в Java:

public class IntDivision < public static void main(String[] args) < int a = 16 / 5; System.out.println(a); >>

Результат выполнения этой программы:

Арифметические операторы над переменными типа char

Операнды арифметических операторов должны иметь числовой тип. Арифметические операторы нельзя выполнять над логическими типами данных, но допускается над типами данных char , поскольку в Java этот тип, по существу, является разновидностью типа int . Например:

public class BasicCharMath1 < public static void main(String[] args) < char c = 'n'; System.out.println(c); System.out.println(c + 1); System.out.println(c / 5); >>
n 111 22

Или как в следующем примере:

public class BasicCharMath2 < public static void main(String[] args) < char c1 = '1'; char c2 = '\u0031'; char c3 = 49; System.out.println(c1 + c2 + c3); >>

Деление по модулю в Java

Оператор деления по модулю — обозначается символом % . Этот оператор возвращает остаток от деления первого числа на второй в Java. При делении целого числа результатом будет так же целое число:

public class DivisionByModule < public static void main(String[] args) < int a = 6 % 5; double b = 6.2 % 5.0; System.out.println(a); System.out.println(b); >>
1 1.2000000000000002

2. Составные арифметические операции с присваиванием

Операция Описание
+= Сложение с присваиванием
-= Вычитание с присваиванием
*= Умножение с присваиванием
/= Деление с присваиванием
%= Деление по модулю с присваиванием

В Java имеются специальные операции, объединяющие арифметические операторы с операцией присваивания. Рассмотрим следующее выражение:

а = а + 4;

B Java эту операцию можно записать следующим образом:

а += 4;

Составные операции с присваиванием позволяют не только уменьшить объем кода, но и позволяют выполнять автоматическое преобразование чего не делают обычные операции:

public class CompoundOperations < public static void main(String[] args) < int a = 1; int b = 2; int c = 3; a += 3; b *= 2; c += a * b; System.out.println(a); System.out.println(b); System.out.println(c); >>

Презентацию с видео можно скачать на Patreon .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *