Numero in virgola mobile arrotondato a 2 decimali in C++

Jinku Hu 12 ottobre 2023
  1. Usa gli specificatori di formato della funzione printf per arrotondare il numero a virgola mobile a 2 decimali in C++
  2. Usa gli specificatori di formato della funzione fprintf per arrotondare il numero a virgola mobile a 2 decimali in C++
  3. Usa std::setprecision e std::fixed per arrotondare il numero a virgola mobile a 2 decimali in C++
Numero in virgola mobile arrotondato a 2 decimali in C++

Questo articolo spiegherà diversi metodi su come arrotondare i numeri in virgola mobile a 2 decimali in C++.

Usa gli specificatori di formato della funzione printf per arrotondare il numero a virgola mobile a 2 decimali in C++

I numeri in virgola mobile hanno una rappresentazione binaria speciale, il che implica che i numeri reali non possono essere rappresentati esattamente dalle macchine. Pertanto, è comune ricorrere a funzioni di arrotondamento quando si opera sui numeri in virgola mobile e si eseguono calcoli su di essi. In questo caso, però, abbiamo solo bisogno di produrre una certa porzione della parte frazionaria dei numeri.

La prima soluzione è utilizzare la funzione printf per visualizzare il testo formattato nello stream stdout. Nota che l’identificatore di formato regolare per i numeri float - %f dovrebbe essere modificato in %.2f. Quest’ultima notazione assicura che solo 2 decimali siano stampati dal numero e, allo stesso tempo, esegue l’arrotondamento secondo le regole matematiche comuni. Tieni presente che una notazione simile può essere utilizzata con identificatori di formato di altri tipi di dati.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<double> floats{-3.512312, -21.1123, -1.99, 0.129, 2.5, 3.111};

  for (auto &item : floats) {
    printf("%.2f; ", item);
  }

  return EXIT_SUCCESS;
}

Produzione:

-3.51; -21.11; -1.99; 0.13; 2.50; 3.11;

Usa gli specificatori di formato della funzione fprintf per arrotondare il numero a virgola mobile a 2 decimali in C++

fprintf è un’altra funzione che può essere usata per eseguire la formattazione dell’output come la chiamata a printf e inoltre, può scrivere in qualsiasi oggetto stream FILE* che può essere passato come primo argomento. Nell’esempio seguente, dimostriamo la stampa nel flusso stderr, una versione senza buffer di stdout per la segnalazione e la registrazione degli errori.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<double> floats{-3.512312, -21.1123, -1.99, 0.129, 2.5, 3.111};

  for (auto &item : floats) {
    fprintf(stderr, "%.2f; ", item);
  }

  return EXIT_SUCCESS;
}

Produzione:

-3.51; -21.11; -1.99; 0.13; 2.50; 3.11;

Usa std::setprecision e std::fixed per arrotondare il numero a virgola mobile a 2 decimali in C++

In alternativa, si può utilizzare la funzione std::setprecision dalla libreria dei manipolatori I/O insieme a std::fixed. Quest’ultimo viene utilizzato per modificare la formattazione predefinita per le operazioni di input/output a virgola mobile. Se lo usiamo insieme a std::setprecision, il risultato è una precisione fissa dei numeri reali, e la precisione può essere specificata con l’argomento intero passato allo stesso std::setprecision.

#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> floats{-3.512312, -21.1123, -1.99, 0.129, 2.5, 3.111};

  for (auto &item : floats) {
    cout << setprecision(2) << fixed << item << "; ";
  }

  return EXIT_SUCCESS;
}

Produzione:

-3.51; -21.11; -1.99; 0.13; 2.50; 3.11;
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