Imposta la precisione dei numeri in virgola mobile in C++
-
Usa
std::setprecision
per impostare la precisione dei numeri in virgola mobile in C++ -
Usa
std::floor
estd::ceil
per modificare la precisione dei numeri in virgola mobile -
Usa
std::round
estd::lround
per modificare la precisione dei numeri in virgola mobile
Questo articolo spiegherà diversi metodi su come impostare la precisione dei numeri in virgola mobile in C++.
Usa std::setprecision
per impostare la precisione dei numeri in virgola mobile in C++
std::setprecision
fa parte della libreria dei manipolatori I/O STL che può essere usata per formattare i flussi di input/output. setprecision
cambia la precisione dei numeri in virgola mobile e richiede solo un parametro integrale che specifica le cifre del numero da visualizzare dopo il punto decimale. Vale a dire, la precisione predefinita assunta implicitamente per i numeri in virgola mobile è di sei cifre dopo la virgola. Tuttavia, a volte il float può essere visualizzato dalla notazione scientifica quando il numero è troppo piccolo e non vengono utilizzati manipolatori. Si noti che tali numeri potrebbero perdere tutte le cifre significative e apparire come zeri, come illustrato nel codice di esempio seguente.
#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.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << setprecision(3) << i << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Produzione:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |
Usa std::floor
e std::ceil
per modificare la precisione dei numeri in virgola mobile
Le funzioni std::floor
e std::ceil
sono fornite dall’intestazione <cmath>
, che era originariamente implementata nella libreria standard C. La funzione ceil
calcola il valore intero più piccolo maggiore o uguale al virgola mobile passato come unico argomento. D’altra parte, floor
calcola il più grande valore intero minore o uguale all’argomento. Queste funzioni sono definite per i tipi float
, double
e long double
.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::fixed;
using std::vector;
int main() {
vector<double> d_vec = {123.231, 2.2343, 0.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::ceil(i) << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::floor(i) << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Produzione:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
124.000000 | 3.000000 | 1.000000 | 27.000000 | 113.000000 | 1.000000 |
123.000000 | 2.000000 | 0.000000 | 26.000000 | 113.000000 | 0.000000 |
Usa std::round
e std::lround
per modificare la precisione dei numeri in virgola mobile
In alternativa, std::round
e std::round
possono essere utilizzati per calcolare i valori interi più vicini che vengono arrotondati dallo zero. È probabile che queste funzioni generino errori relativi all’aritmetica in virgola mobile, discussi in dettaglio nella pagina.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::fixed;
using std::vector;
int main() {
vector<double> d_vec = {123.231, 2.2343, 0.012,
26.9491092019, 113, 0.000000234};
for (auto &i : d_vec) {
cout << i << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::round(i) << " | ";
}
cout << endl;
for (auto &i : d_vec) {
cout << fixed << std::lround(i) << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
Produzione:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.000000 | 2.000000 | 0.000000 | 27.000000 | 113.000000 | 0.000000 |
123 | 2 | 0 | 27 | 113 | 0 |
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