Definir a precisão dos números de ponto flutuante em C++
- 
          
            Use std::setprecisionpara definir a precisão dos números de ponto flutuante em C++
- 
          
            Use std::floorestd::ceilpara modificar a precisão dos números de ponto flutuante
- 
          
            Use std::roundestd::lroundpara modificar a precisão dos números de ponto flutuante
 
Este artigo explicará vários métodos de como definir a precisão de números de ponto flutuante em C++.
Use std::setprecision para definir a precisão dos números de ponto flutuante em C++
    
std::setprecision é parte da biblioteca de manipuladores de I/O STL que pode ser usada para formatar os fluxos de entrada/saída. setprecision altera a precisão dos números de ponto flutuante, e leva apenas um parâmetro integral especificando os dígitos do número a serem exibidos após o ponto decimal. Ou seja, a precisão padrão assumida implicitamente para os números de ponto flutuante é de seis dígitos após a vírgula. Ainda assim, às vezes o float pode ser exibido pela notação científica quando o número é muito pequeno e nenhum manipulador é usado. Observe que esses números podem perder todos os dígitos significativos e aparecer como zeros, conforme demonstrado no código de exemplo a seguir.
#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;
}
Resultado:
123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |
Use std::floor e std::ceil para modificar a precisão dos números de ponto flutuante
As funções std::floor e std::ceil são fornecidas pelo cabeçalho <cmath>, que foi originalmente implementado na biblioteca C padrão. A função ceil calcula o menor valor inteiro maior ou igual ao ponto flutuante passado como o único argumento. Por outro lado, floor calcula o maior valor inteiro menor ou igual ao argumento. Essas funções são definidas para os tipos 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;
}
Resultado:
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 |
Use std::round e std::lround para modificar a precisão dos números de ponto flutuante
Alternativamente, std::round e std::round podem ser utilizados para calcular os valores inteiros mais próximos que são arredondados de zero. Essas funções provavelmente geram erros relacionados à aritmética de ponto flutuante, que são discutidos em detalhes na página.
#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;
}
Resultado:
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