Дробные числа и операции (double)

Дробные числа нужны, когда важна часть после запятой: длина, время, скорость, площадь, средний балл и т.п.
В Java для таких значений обычно используют тип double.

Типичная схема: считать числа c дробной частью, посчитать по формуле и вывести результат.

double a = 7.5;
double b = 3.0;
double sum = a + b;

System.out.println(sum);  // 10.5

Краткая сводка

Переменная дробного типа объявляется так:

double имя = значение;

Примеры:

double x = 0.0;
double pi = 3.14159;
double speed = 12.5;

Основные операции над double те же, что и для int:

  • сложение: +
  • вычитание: -
  • умножение: *
  • деление: /

Остаток % с double почти не нужен в базовых задачах, достаточно знать, что он существует.


Тип double

double хранит числа с дробной частью (вещественные числа).
Примеры:

double temp = 36.6;
double length = 2.75;
double ratio = 1.0 / 3.0;  // 0.3333...

Для физических величин (скорость, путь, время), процентов, средних значений обычно используют именно double.


Деление double

При делении double / double результат тоже double, дробная часть сохраняется:

double a = 7.0;
double b = 3.0;

double q = a / b;   // примерно 2.3333333

Если делитель или делимое — int, а другой операнд double, выражение автоматически считается в double:

int a = 7;
int b = 3;

double q1 = a / b;      // 2.0  (целочисленное деление, результат потом в double)
double q2 = a / 3.0;    // 2.3333... (одно из чисел double)
double q3 = (double)a / b; // тоже 2.3333...

Важно: если оба операнда целые (int), сначала выполняется целочисленное деление, а уже потом результат превращается в double.
Чтобы получить настоящий дробный результат, хотя бы один операнд должен быть double (например, 3.0 вместо 3).


Смешанные выражения int и double

Когда в выражении встречаются и int, и double, Java автоматически «поднимает» результат к double.

Пример:

int    n = 5;
double x = 2.5;

double s1 = n + x;    // 7.5
double s2 = n * x;    // 12.5

Частый приём: привести одно из чисел к double, чтобы получить дробный результат:

int sum = 7;
int count = 2;

double avg1 = sum / count;        // 3.0  (целая часть)
double avg2 = sum / (double)count; // 3.5  (настоящее среднее)
double avg3 = sum / 2.0;          // 3.5

Округление и форматированный вывод

Иногда результат нужно округлить или вывести с определённым количеством знаков после запятой.

Округление:

double x = 3.56;

long r1 = Math.round(x);   // 4
double f = Math.floor(x);  // 3.0  (вниз)
double c = Math.ceil(x);   // 4.0  (вверх)

Форматированный вывод через printf:

double x = 3.14159265;

System.out.printf("x = %.2f%n", x);  // x = 3.14
System.out.printf("x = %.4f%n", x);  // x = 3.1416

%.2f — число с плавающей точкой с 2 знаками после запятой,
%.4f — с 4 знаками после запятой.


Типичные шаблоны

Средняя скорость

double distance = in.nextDouble();   // путь
double time = in.nextDouble();       // время

double speed = distance / time;

System.out.println(speed);

Среднее арифметическое

double a = in.nextDouble();
double b = in.nextDouble();
double c = in.nextDouble();

double avg = (a + b + c) / 3.0;

System.out.println(avg);

Процент от числа

double value = in.nextDouble();
double p = in.nextDouble();   // процент

double part = value * p / 100.0;

System.out.println(part);

Перевод градусов в радианы

\[ \text{rad} = \text{deg} \cdot \frac{\pi}{180} \]
double deg = in.nextDouble();
double rad = deg * Math.PI / 180.0;

System.out.println(rad);

Что нужно запомнить

Для чисел с дробной частью в Java обычно используют тип double:

double x = 3.5;

Выражение с int и double считается в типе double. Чтобы деление было «настоящим» дробным, хотя бы один операнд должен быть double.

Для вывода аккуратных дробных результатов удобно использовать Math.round, Math.floor, Math.ceil и форматированный вывод printf с %.2f, %.3f и т.п.