Вещественные числа

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

Тип

В Java для дробных значений обычно используют double.

double x = 7.5;
double y = 3.0;
System.out.println(x + y); // 10.5

Деление

Деление double / double сохраняет дробную часть.

double a = 7.0;
double b = 3.0;
System.out.println(a / b); // 2.3333333333333335

Если оба числа целые (int), сначала выполняется целочисленное деление.

int a = 7;
int b = 3;

System.out.println(a / b);        // 2
System.out.println(a / 3.0);      // 2.3333333333333335
System.out.println((double) a / b); // 2.3333333333333335

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

Если в выражении есть и int, и double, результат становится double.

int n = 5;
double t = 2.5;

System.out.println(n + t); // 7.5
System.out.println(n * t); // 12.5

Округление и вывод

Для округления часто используют Math.round, Math.floor, Math.ceil.

double x = 3.56;

System.out.println(Math.round(x)); // 4
System.out.println(Math.floor(x)); // 3.0
System.out.println(Math.ceil(x));  // 4.0

Для вывода с фиксированным количеством знаков удобно printf.

double p = Math.PI;
System.out.printf("pi = %.2f%n", p);
System.out.printf("pi = %.4f%n", p);

Примеры

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

double a = 10.0;
double b = 20.0;
double c = 25.0;

double avg = (a + b + c) / 3.0;
System.out.println(avg);

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

double value = 250.0;
double p = 12.0;

double part = value * p / 100.0;
System.out.println(part);

Типы дробных чисел

В C++ для дробных значений чаще всего используют double.

double x = 7.5;
double y = 3.0;

Также есть:

  • float — обычно меньше точность;
  • long double — обычно больше точность.

Ввод и вывод

Ввод дробного числа:

double x;
cin >> x;

Обычный вывод:

cout << x << "\n";

Вывод с фиксированным числом знаков после запятой:

#include <iomanip>

cout << fixed << setprecision(2) << x << "\n";

Деление

Деление double / double сохраняет дробную часть:

double a = 7.0, b = 3.0;
cout << a / b << "\n"; // 2.33333...

Если оба операнда целые, деление будет целочисленным:

int a = 7, b = 3;
cout << a / b << "\n";                        // 2
cout << a / 3.0 << "\n";                      // 2.33333...
cout << static_cast<double>(a) / b << "\n";  // 2.33333...

Точность и сравнение

double хранит число приближенно, поэтому точное сравнение дробей часто ненадежно.

double x = 0.1 + 0.2;
double y = 0.3;
cout << (x == y) << "\n"; // чаще всего 0 (false)

Обычно сравнивают через маленькое число eps:

#include <cmath>

const double eps = 1e-9;
if (fabs(x - y) < eps) {
    cout << "equal\n";
}

Округление

Функции из <cmath>:

  • round(x) — округление к ближайшему целому;
  • floor(x) — вниз;
  • ceil(x) — вверх.
#include <cmath>

double x = 3.56;
cout << round(x) << "\n"; // 4
cout << floor(x) << "\n"; // 3
cout << ceil(x) << "\n";  // 4

Примеры

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

double a = 10.0, b = 20.0, c = 25.0;
double avg = (a + b + c) / 3.0;
cout << avg << "\n";

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

double value = 250.0;
double p = 12.0;
double part = value * p / 100.0;
cout << part << "\n";

По материалам:
М. Густокашин. Введение в программирование на языке C++. Сириус Курсы. Перейти к курсу.

Тип

В Python дробные числа – это float.

x = 7.5
y = 3.0
print(x + y)  # 10.5

Деление

Оператор / всегда даёт дробный результат.

a = 7
b = 3

print(a / b)   # 2.3333333333333335
print(a // b)  # 2

Округление и вывод

Округление: round(x).

x = 3.56
print(round(x))  # 4

Вывод с количеством знаков часто делают через форматирование.

import math

p = math.pi
print(f"pi = {p:.2f}")
print(f"pi = {p:.4f}")

Примеры

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

a = 10.0
b = 20.0
c = 25.0

avg = (a + b + c) / 3.0
print(avg)

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

\[ \text{rad} = \text{deg} \cdot \frac{\pi}{180} \]
import math

deg = 60.0
rad = deg * math.pi / 180.0
print(rad)

Тип дробных чисел

Язык Тип Где часто спотыкаются
Java double целочисленное деление int / int даёт int
C++ double целочисленное деление int / int даёт int
Python float / всегда дробное, а // – целая часть

Как получить дробный результат при делении целых

Java: сделать один операнд double.

int a = 7, b = 3;
System.out.println(a / 3.0);
System.out.println((double) a / b);

C++: сделать один операнд double.

int a = 7, b = 3;
std::cout << (a / 3.0) << "\n";
std::cout << (static_cast<double>(a) / b) << "\n";

Python: / уже даёт дробный результат.

a = 7
b = 3
print(a / b)

Вывод с количеством знаков после запятой

Java: printf("%.2f").

C++: std::fixed << std::setprecision(2).

Python: f"{x:.2f}".

Во всех трёх языках double/float хранят число приближённо, поэтому сравнение дробных чисел на точное равенство часто даёт неожиданные результаты.