Блок 1. Раздел 1. Тема 6

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

Во многих приложениях есть скидки - столько-то процентов на тот или иной товар. Поэтому программисты должны уметь запрограммировать взятие процента - просто умножить на число процентов и поделить на 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. Чтобы не писать один и тот же код много раз применяют циклы, они позволяют запускать кусок кода много раз подряд. Но о циклах в следующих разделах, а пока мы поняли, что % - остаток от деления одного числа на другое бывает полезен, чтобы сформировать последовательность чисел от нуля до заданного числа, повторяющуюся подряд нужное число раз. Такие последовательности бывают нужны в самых разных задачах, например, когда вы хотите задать координаты персонажам в игре и расставить их по экрану - каждый следующий правее, и так до конца экрана, а потом снова слева направо уже по следующей строчке.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Задача 1. Пусть известно, что компания получает с каждым годом на 10% больше прибыли, чем в предыдущем году. Исходная прибыль задана переменной profit в коде ниже (в реальности могла быть считана из файла с финансовым отчетом компании). Напишите программу, которая рассчитывает и печатает прогноз прибыли компании в течение 5 лет.

package javaapplication1;
public class JavaApplication1 {
public static void main(String[] args) {
  double profit = 1000000; // 1 миллион рублей в год - текущая прибыль компании.
  // TODO: допишите код
 }   
}
Решайте больше задач по этому разделу здесь.
В следующей теме дадим check-list самых популярных ошибок, связанных с переменными, и подведем итоги раздела