Как вывести число с нужной точностью
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double x = 3.14159265;
cout << fixed << setprecision(2) << x << "\n";
cout << setprecision(5) << x << "\n";
cout << setprecision(3) << 2.0 << "\n";
return 0;
}3.14
3.14159
2.000fixed — запись с фиксированной точкой (обычная, без вида 1e+06), setprecision(n) — сколько цифр после запятой. Нужен #include <iomanip>. Обе настройки действуют на весь дальнейший вывод в cout, пока их не поменяют, — писать их перед каждым числом не нужно. Хвостовые нули тоже выводятся: 2.000.
Без fixed — значащие цифры
Без fixed число setprecision задаёт не знаки после запятой, а все значащие цифры. По умолчанию их 6, и большие или очень маленькие числа выводятся в научной записи:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << 1234.5678 << "\n";
cout << 1000000.0 << "\n";
cout << 0.00001234 << "\n";
cout << setprecision(3) << 3.14159 << "\n";
return 0;
}1234.57
1e+06
1.234e-05
3.141e+06 — это 1·10⁶, то есть миллион. Если в задаче нужен вывод «как в примере», почти всегда нужен fixed.
printf
То же через функцию языка C — printf из <cstdio>:
#include <cstdio>
int main() {
double x = 2.0 / 3;
printf("%.3f\n", x);
printf("%.0f\n", x);
return 0;
}0.667
1%.3f — три знака после запятой. В одной программе printf и cout можно смешивать, если не отключали синхронизацию через ios::sync_with_stdio(false) (см. Быстрый ввод-вывод).
Как округляется
Вывод округляет число до ближайшего с нужным числом знаков. Но дробные числа хранятся в двоичном виде приблизительно, поэтому «пятёрка на конце» иногда округляется вниз:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << fixed << setprecision(2) << 2.675 << "\n";
return 0;
}2.67На самом деле в памяти лежит не 2.675, а 2.67499999999999982… — и оно честно округляется до 2.67. Обычно это не важно: проверяющие системы сравнивают дробные ответы с допуском.
Подводные камни
setprecisionбез#include <iomanip>— ошибка'setprecision' was not declared in this scope.- Целое число
fixedне меняет:cout << fixed << setprecision(2) << 5;выведет5. Чтобы получить5.00, выводите дробное:5.0или(double)n. - Деление целых даёт целое ещё до вывода:
7 / 2— это 3, иsetprecisionего не спасёт. Пишите7.0 / 2.