JavaRush/Java блог/Архив info.javarush/Оператор деления по модулю
L2CCCP
9 уровень

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

Статья из группы Архив info.javarush
участников
Оператор деления по модулю - оператор mod, обозначается символом %. Оператор деления по модулю - 1Этот оператор возвращает остаток от деления первого операнда на второй. Оператор 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 = " + d % 10);
	}
}
Выполнив эту программу, вы получите следующий результат:
i mod 10 = 7
d mod 10 = 7.300000000000001
С работой данного оператора разобрались, но как же его использовать. Как вариант для склонения слов в зависимости от количества. Так как я работаю разработчиком эмулятора игры на java для меня очень важно чтобы многие слова в сообщениях склонялись. К примеру:
  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 языка.
Комментарии (21)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3376314
Уровень 2
17 ноября 2023, 21:01
Если кому интересно: В Java функцию "честного" MOD (если так можно выразиться) выполняет метод: Math.floorMod.
Andrii Zaika
Уровень 52
11 февраля, 13:33
Спасибо за инфу об этом методе! Очень пригодился этот метод для реализации задания с декодированием шифра Цезаря. Стандартный оператор деления по модулю % c отрицательными аргументами именно для этого алгоритма работает некорректно. Для положительных чисел что оператор %, что метод Math.floorMod дают один и тот же результат. А вот для отрицательных результаты отличаются. В этой статейке хорошо описано как именно реализован метод Math.floorMod()
Vell_keks QA Automation Engineer в Crypto
28 августа 2022, 12:14
Статья очень плохая, даже на 20 уровне с трудом по ней получается вспомнить, что такое деление по модулю. Ниже кидали: https://vertex-academy.com/tutorials/ru/delenie-po-modulyu-v-java/ Вот тут реально понятнее, нужно или добавить её в список рекомендуемых или переписать как-то на основе...
Богдан
Уровень 18
27 июля 2022, 20:51
Оператор деления по модулю - оператор mod, обозначается символом %.
Ошибка с самого первого предложения, скажете так на собеседовании, с вами даже общаться не станут! a % b НЕ равно a mod b!
Andrei
Уровень 7
27 сентября 2021, 13:04
Не понял почему проверяется если count > 100 и > 20. Так же скриншот не удачен, вместо нумерации строк, полезнее было бы охватить код.
Igoreek
Уровень 23
12 июля 2020, 13:47
Статью можно переименовать в "Склонения" или "Пример использования оператора деления по модулю" новичку тут читать нечего.
Crew Dragon
Уровень 11
28 мая 2020, 19:44
очень поверхностная статья, несерьезно ....
Илья
Уровень 6
11 апреля 2020, 14:32
Более толково описано в данной статье: https://vertex-academy.com/tutorials/ru/delenie-po-modulyu-v-java/
Василий
Уровень 1
23 ноября 2019, 22:25
интересно что вам все так понятно? я вообще не понял при чем здесь склонения и какой здесь наглядный пример с делением по модулю..вообще не могу вдуплить...
Roman
Уровень 4
22 февраля 2020, 10:37
Делай выводы
Егор
Уровень 35
26 сентября 2019, 05:37
Отличная статья! Написано доступно, спасибо, автор!
Владимир
Уровень 1
22 апреля 2019, 09:26
А если так ? int day[] = {1, 2, 5}; int hour[] = {1, 4, 9}; for (int x =0; x < day.length; x++) { System.out.println("Вы играете уже " + day[x] + " " + declension(day[x], "Days") + " и " + hour[x] + " " + declension(hour[x], "Hour")); }