Usa setprecision in C++

Jinku Hu 12 ottobre 2023
  1. Usa il metodo setprecision() per impostare la precisione personalizzata per i flottanti
  2. Usa setprecision() e std::fixed() per impostare la precisione personalizzata per i flottanti
  3. Usa setprecision() e std::fixed() per allineare i galleggianti a un punto decimale
Usa setprecision in C++

Questo articolo mostrerà diversi metodi su come utilizzare il metodo setprecision in C++.

Usa il metodo setprecision() per impostare la precisione personalizzata per i flottanti

setprecision() fa parte della libreria dei manipolatori I/O <iomanip> e può essere usato per modificare la precisione predefinita dei numeri in virgola mobile. setprecision() viene solitamente utilizzato nelle espressioni con flussi di I/O.

L’esempio seguente mostra come impostare la precisione del numero float per l’oggetto flusso di output cout. Si noti che setprecision() si applica al numero intero (parte intera e parte frazionaria) e utilizza la notazione scientifica quando i numeri hanno una grandezza maggiore della precisione specificata.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << setprecision(3) << i << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

123 | 2.23 | 0.324 | 0.012 | 26.9 | 1.1e+04 | 92 | 2.34e-07 |

Usa setprecision() e std::fixed() per impostare la precisione personalizzata per i flottanti

In alternativa, possiamo usare i manipolatori di flusso setprecision() e fixed() insieme per stampare valori in virgola mobile con lo stesso numero di cifre dopo il punto decimale. Il metodo fixed() imposta la parte frazionaria del numero su una lunghezza fissa, che per impostazione predefinita è di 6 cifre. Nel seguente esempio di codice, eseguiamo l’output nel flusso cout e chiamiamo entrambi i manipolatori prima che il numero venga inserito nell’output.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << fixed << setprecision(3) << i << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

123.231 | 2.234 | 0.324 | 0.012 | 26.949 | 11013.000 | 92.001 | 0.000 |

Usa setprecision() e std::fixed() per allineare i galleggianti a un punto decimale

Infine, possiamo combinare i manipolatori setw, right, setfill, fixed e setprecision per produrre numeri in virgola mobile allineati al punto decimale. Il metodo setw specifica la larghezza del flusso di output con il numero di caratteri passati come argomento. setfill imposta un carattere con il quale verrà riempito lo spazio inutilizzato e il metodo right dice a cout il lato a cui si applica l’operazione di riempimento.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << std::setw(10) << std::right << std::setfill(' ') << fixed
         << setprecision(4) << i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

  123.2310
    2.2343
    0.3240
    0.0120
   26.9491
11013.0000
   92.0011
    0.0000
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Float