Вычисляем проценты и
остаток от деления нацело
Во многих приложениях есть скидки — столько-то процентов на тот или иной товар. Поэтому программисты должны уметь запрограммировать взятие процента — просто умножить на число процентов и поделить на 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. Чтобы не писать один и тот же код много раз применяют циклы, они позволяют запускать кусок кода много раз подряд. Но о циклах в следующих разделах, а пока мы поняли, что % — остаток от деления одного числа на другое бывает полезен, чтобы сформировать последовательность чисел от нуля до заданного числа, повторяющуюся подряд нужное число раз. Такие последовательности бывают нужны в самых разных задачах, например, когда вы хотите задать координаты персонажам в игре и расставить их по экрану — каждый следующий правее, и так до конца экрана, а потом снова слева направо уже по следующей строчке.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Остаток от деления в Java и Python
Решаю одну и ту же простую задачу на Python и Java. Алгоритм идентичен, но результаты почему-то разные. Причина нашлась: в решении использую «%» (остаток от деления) и, если первая переменная имеет отрицательное значение, то почему-то результаты разнятся:
print(-1 % 109) #Python.
System.out.println(-1 % 109); //Java.
Вывод: -1 Объясните, пожалуйста, почему разные результаты?
Отслеживать
задан 11 янв 2022 в 21:12
133 1 1 серебряный знак 9 9 бронзовых знаков
Разная реализация нахождения остатка для отрицательных аргументов зависит от конкретного языка. Оба результата правильны. Какой результат вам нужен?
11 янв 2022 в 21:42
В вике есть статья, рассматривающая эту тему (в ней есть таблица про знак остатка в разных языках)
11 янв 2022 в 21:46
Спасибо за ответ! Мне нужен был именно положительный остаток, как в Python. Решение найдено с использованием Math.floorMod()
Как работает остаток от деления java
Остаток от деления — это целое число, полученное в результате операции деления с остатком. Если остаток от деления равен, то число делится на делитель нацело. В Java остаток от деления одного числа на другое можно получить при помощи оператора %
System.out.println(3 % 2); // => 1 System.out.println(4 % 2); // => 0
Рассмотрим работу оператора на примере. Поделим число 78 на 33. При делении мы получим неполное частное 2 и остаток от деления. Чтобы убедиться в правильности результата, нужно неполное частное умножить на делитель и прибавить остаток от деления:
Деление по модулю в Java
Ещё со школы мы знакомы с таким понятием как обычное деление:
С этим все понятно. А что же это за «зверь» такой, деление по модулю ? И звучит то так угрожающе. А на самом деле всё очень и очень просто. Давайте разбираться.
Что Вам нужно понимать:
Как работает оператор сложения, вычитания и т.д. наверняка Вы уже знаете. А вот за что отвечает деление по модулю поймёте буквально через пару минут. Немного терпения.
- Деление по модулю обозначается вот таким знаком: %
- Деление по модулю иногда называют mod. То есть если увидите название mod, знайте, речь идет об операторе деление по модулю.
- В чём суть оператора? Деление по модулю даёт остаток от деления.
Давайте посмотрим на примерах как это работает.
Пример №1
Необходимо разделить 9 на 4, используя:
- обычное деление, как нас учили в школе
- деление по модулю

Логику работы оператора деления по модулю Вы уже поняли. Самое время попробовать запустить пример на своём компьютере:
class Test < public static void main ( String [ ] args ) < int m = n % k ; System . out . println ( m ) ;
Если Вы запустите этот код на своём компьютере, то в консоль будет выведено такое число:
Пример №2
Необходимо разделить 17 на 5, используя:
- обычное деление, как нас учили в школе
- деление по модулю

И пробуем теперь запустить программу на компьютере:
class Test < public static void main ( String [ ] args ) < int m = n % k ; System . out . println ( m ) ;
Если Вы запустите этот код на своём компьютере, то в консоль будет выведено такое число:
Пример №3
Необходимо разделить 21 на 7, используя:
- обычное деление, как нас учили в школе
- деление по модулю

И пробуем теперь запустить программу на компьютере:
class Test < public static void main ( String [ ] args ) < int m = n % k ; System . out . println ( m ) ;
Если Вы запустите этот код на своём компьютере, то в консоль будет выведено такое число:
Пример №4
Необходимо разделить 7.6 на 2.9, используя:
- обычное деление, как нас учили в школе
- деление по модулю

И пробуем теперь запустить программу на компьютере:
class Test < public static void main ( String [ ] args ) < double n = 7.6 ; double k = 2.9 ; double m = n % k ; System . out . println ( m ) ;
Если Вы запустите этот код на своём компьютере, то в консоль будет выведено число, близкое к 1.8. Например, Вы можете увидеть какое-то такое число: 1.7999999999999998. Из-за определённых особенностей Java, которые мы будем с Вами рассматривать позже в других статьях, на разных компьютерах число будет немного отличаться. Но оно будет близкое по значению к 1.8
Итак, как Вы уже поняли, оператор деления по модулю вычисляет остаток от деления.
- Применяется к таким типам переменных:
- Byte, short, Int, long – целочисленный тип переменных
- Float, Double – числа с плавающей точкой
- Отрицательные и положительные числа
Есть небольшой нюанс при использовании оператора деления по модулю с отрицательными и положительными числами.
Работает простое правило:
- Отбрасываете знак минуса
- Делите числа как обычно
- А далее, если первое число (делимое), было со знаком минус, к результату добавляете знак минус.
Пример №5

И пробуем теперь запустить программу на компьютере — один из описанных выше примеров:
