Cómo usar setprecision en C++

Jinku Hu 12 octubre 2023
  1. Usar el método setprecision() para establecer una precisión personalizada para los floates
  2. Use setprecision() y std::fixed() para establecer la precisión personalizada para las boyas
  3. Usa setprecision() y std::fixed() para alinear los floates a un punto decimal
Cómo usar setprecision en C++

Este artículo demostrará múltiples métodos sobre cómo usar el método setprecision en C++.

Usar el método setprecision() para establecer una precisión personalizada para los floates

setprecision() es parte de la biblioteca de manipuladores de I/O <iomanip> y puede ser usada para modificar la precisión por defecto de los números de punto flotante. setprecision() se usa normalmente en expresiones con flujos de E/S.

El siguiente ejemplo muestra cómo establecer la precisión de los números de punto flotante para el objeto de flujo de salida cout. Observe que, setprecision() se aplica al número entero (parte entera y parte fraccionaria) y utiliza la notación científica cuando los números tienen una magnitud mayor que la precisión especificada.

#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;
}

Resultado:

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

Use setprecision() y std::fixed() para establecer la precisión personalizada para las boyas

Alternativamente, podemos usar manipuladores de setprecision() y fixed() en conjunto para imprimir valores de punto flotante con el mismo número de dígitos después del punto decimal. El método fixed() establece la parte fraccionaria del número a una longitud fija, que por defecto es de 6 dígitos. En el siguiente ejemplo de código, salimos a la corriente de cout y llamamos a ambos manipuladores antes de que el número se inserte en la salida.

#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;
}

Resultado:

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

Usa setprecision() y std::fixed() para alinear los floates a un punto decimal

Finalmente, podemos combinar los manipuladores setw, right, setfill, fixed y setprecision para obtener números de punto flotante alineados con el punto decimal. El método setw especifica el ancho del flujo de salida con el número de caracteres pasados como argumento. El método setfill establece un carácter por el cual se llenará el espacio no utilizado y el método right le dice al cout el lado al que se aplica la operación de llenado.

#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;
}

Resultado:

  123.2310
    2.2343
    0.3240
    0.0120
   26.9491
11013.0000
   92.0011
    0.0000
Autor: 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

Artículo relacionado - C++ Float