Ce face std::setprecision
Implicit, std::cout afișează numerele reale cu cel mult 6 cifre semnificative și alege singur între forma obișnuită și cea științifică. std::setprecision(n) schimbă numărul de cifre semnificative: 3.14159 cu precizia 3 devine 3.14.
Împreună cu std::fixed, n înseamnă numărul de zecimale: std::fixed << std::setprecision(2) afișează prețuri ca 12.50. std::scientific folosește mereu notația științifică (1.50e+06), cu n zecimale.
Toate trei rămân active până le schimbi. std::defaultfloat revine la modul implicit. Valoarea este rotunjită doar la afișare; numărul din variabilă nu se schimbă.
Parametri
| Parametru | Descriere |
|---|---|
n |
Numărul de cifre semnificative (implicit) sau de zecimale (cu fixed / scientific). |
Exemple
Exemplul 1: Cifre semnificative, fără fixed
#include <iomanip>
#include <iostream>
int main() {
double pi = 3.14159265;
std::cout << pi << '\n'; // implicit 6 cifre
std::cout << std::setprecision(3) << pi << '\n';
std::cout << 1234.567 << '\n'; // 3 cifre nu ajung: notație științifică
std::cout << std::setprecision(10) << pi << '\n';
}
Rezultat
3.14159
3.14
1.23e+03
3.14159265
Exemplul 2: Prețuri cu două zecimale
Cu std::fixed, setprecision(2) înseamnă exact două zecimale, chiar și pentru numere întregi.
#include <iomanip>
#include <iostream>
int main() {
double preturi[] = {12.5, 7.0, 19.999, 1299.0};
std::cout << std::fixed << std::setprecision(2);
for (double p : preturi) {
std::cout << p << " lei\n";
}
}
Rezultat
12.50 lei
7.00 lei
20.00 lei
1299.00 lei
Exemplul 3: Notație științifică și revenirea la normal
După std::defaultfloat, numărul 19053815 are mai mult de 6 cifre semnificative, așa că modul implicit îl afișează tot în notație științifică.
#include <iomanip>
#include <iostream>
int main() {
double populatie = 19053815.0;
double atom = 0.000000000106;
std::cout << std::scientific << std::setprecision(2);
std::cout << populatie << '\n' << atom << '\n';
std::cout << std::defaultfloat << std::setprecision(6);
std::cout << populatie << '\n';
}
Rezultat
1.91e+07
1.06e-10
1.90538e+07
Greșeli frecvente
- Scrii
setprecision(2)fărăfixedși te aștepți la două zecimale:12.5devine12, iar1299.5devine1.3e+03, pentru că 2 înseamnă cifre semnificative. - Crezi că
setprecisionrotunjește variabila. Doar afișarea este rotunjită; calculele folosesc valoarea completă. - Pentru bani,
doublenu este exact (0.1 + 0.2nu este exact0.3). Pentru sume importante se lucrează în bani întregi (long long), nu în lei cu zecimale.
Comenzi înrudite
std::setw: Stabilește lățimea minimă a următoarei valori, cu aliniere și caracter de umplere.std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).std::showpos: Afișează semnul + în fața numerelor pozitive (și a lui zero).std::to_chars: Scrie un număr ca text într-un tablou de char, foarte rapid, fără alocări și fără excepții.