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
Если кому интересно: В Java функцию "честного" MOD (если так можно выразиться) выполняет метод: Math.floorMod.
Vell_keks Уровень 25
28 августа 2022
Статья очень плохая, даже на 20 уровне с трудом по ней получается вспомнить, что такое деление по модулю. Ниже кидали: https://vertex-academy.com/tutorials/ru/delenie-po-modulyu-v-java/ Вот тут реально понятнее, нужно или добавить её в список рекомендуемых или переписать как-то на основе...
Богдан Уровень 18
27 июля 2022
Оператор деления по модулю - оператор mod, обозначается символом %.
Ошибка с самого первого предложения, скажете так на собеседовании, с вами даже общаться не станут! a % b НЕ равно a mod b!
Andrei Уровень 7
27 сентября 2021
Не понял почему проверяется если count > 100 и > 20. Так же скриншот не удачен, вместо нумерации строк, полезнее было бы охватить код.
Igoreek Уровень 23
12 июля 2020
Статью можно переименовать в "Склонения" или "Пример использования оператора деления по модулю" новичку тут читать нечего.
Crew Dragon Уровень 11
28 мая 2020
очень поверхностная статья, несерьезно ....
Илья Уровень 6
11 апреля 2020
Более толково описано в данной статье: https://vertex-academy.com/tutorials/ru/delenie-po-modulyu-v-java/
Василий Уровень 1
23 ноября 2019
интересно что вам все так понятно? я вообще не понял при чем здесь склонения и какой здесь наглядный пример с делением по модулю..вообще не могу вдуплить...
Егор Уровень 35
26 сентября 2019
Отличная статья! Написано доступно, спасибо, автор!
Владимир Уровень 1
22 апреля 2019
А если так ? 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")); }