std::setprecision în C++

Formatare C++98

Controlează câte cifre sau zecimale au numerele reale afișate, cu fixed și scientific.

Sintaxă
#include <iomanip>
std::cout << std::setprecision(n) << numar;
std::cout << std::fixed;       // n = zecimale
std::cout << std::scientific;  // notație științifică

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.5 devine 12, iar 1299.5 devine 1.3e+03, pentru că 2 înseamnă cifre semnificative.
  • Crezi că setprecision rotunjește variabila. Doar afișarea este rotunjită; calculele folosesc valoarea completă.
  • Pentru bani, double nu este exact (0.1 + 0.2 nu este exact 0.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.