Блок 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. Чем в Java отличается символ % от вычисления процента от числа?
Отличается всем, это две совершенно разные операции. Символ % означает расчет остатка от деления одного числа на другое нацело.
Вопрос 2. Сколько будет остаток от деления 62 на 3?
Ближайшее число, делящееся нацело - это 60, поэтому в остатке будет 2. Итак, 62 поделить на 3 будет 20 целых с остатком от деления равным 2.
Задача 1. Пусть известно, что компания получает с каждым годом на 10% больше прибыли, чем в предыдущем году. Исходная прибыль задана переменной profit в коде ниже (в реальности могла быть считана из файла с финансовым отчетом компании). Напишите программу, которая рассчитывает и печатает прогноз прибыли компании в течение 5 лет.
package javaapplication1;
public class JavaApplication1 {
public static void main(String[] args) {
  double profit = 1000000; // 1 миллион рублей в год - текущая прибыль компании.
  // TODO: допишите код
 }   
}
Вывод программы решения
Текущая прибыль компании 1000000.0
Через 1 год прибыль будет 1100000.0
Через 2 года прибыль будет 1210000.0
Через 3 года прибыль будет 1331000.0
Через 4 года прибыль будет 1464100.0
Через 5 лет прибыль будет 1610510.0
Решение
double profit = 1000000;
//в распечатке строка "..." + число сделает строчку,
// в которую дописано наше число profit, очень удобно:
System.out.println ("Текущая прибыль компании " + profit);
// увеличить переменную на 10% от старого значения:
profit += profit * 0.1;
System.out.println ("Через 1 год прибыль будет " + profit);
profit += profit * 0.1;
System.out.println ("Через 2 года прибыль будет " + profit);
profit += profit * 0.1;
System.out.println ("Через 3 года прибыль будет " + profit);
profit += profit * 0.1;
System.out.println ("Через 4 года прибыль будет " + profit);
profit += profit * 0.1;
System.out.println ("Через 5 лет прибыль будет " + profit);

// в дальнейших разделах мы сможем написать цикл, а не
// копировать много раз один и тот же код, но пока и так решается.
Решайте больше задач по этому разделу здесь.
В следующей теме дадим check-list самых популярных ошибок, связанных с переменными, и подведем итоги раздела