Convertir float a cadena con precisión establecida y número de dígitos decimales?


¿Cómo se convierte un float en una cadena en C++ al especificar la precisión y el número de dígitos decimales?

Por ejemplo: 3.14159265359 -> "3.14"

Author: user2864740, 2015-03-23

4 answers

#include <iomanip> // setprecision
#include <sstream> // stringstream

double pi = 3.14159265359;
stringstream stream;
stream << fixed << setprecision(2) << pi;
string s = stream.str();

Véase fijo

Utilizar la notación de coma flotante fija

Establece la bandera de formato floatfieldpara el flujo str a fixed.

Cuando floatfield se establece en fixed, los valores de coma flotante se escriben utilizando notación de punto fijo: el valor se representa con exactamente tantos dígitos en la parte decimal como se especifica en el campo de precisión (precision) y sin exponente.

Y precisión de ajuste.

 74
Author: AlexD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 18:43:36

El método habitual para hacer este tipo de cosas es "imprimir en cadena". En C++ eso significa usar std::stringstream algo como:

std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
 20
Author: Mats Petersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-22 22:38:58

Otra opción es snprintf:

double pi = 3.1415926;

std::string s(16, '\0');
auto written = std::snprintf(&s[0], s.size(), "%.2f", pi);
s.resize(written);

Demo. Se debe agregar el manejo de errores, es decir, la comprobación de written < 0.

 6
Author: Columbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-22 23:06:33

Aquí estoy proporcionando un ejemplo negativo donde desea evitar al convertir números flotantes en cadenas.

float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;

Se obtiene

99463 99.463 99.462997

Nota: la variable num puede ser cualquier valor cercano a 99.463, obtendrá la misma impresión. El punto es evitar la conveniente función "to_string" de c++11. Me tomó un tiempo salir de esta trampa. La mejor manera son los métodos stringstream y sprintf (lenguaje C). C++11 o posterior debe proporcionar un segundo parámetro como el número de dígitos después del punto flotante para mostrar. En este momento el valor predeterminado es 6. Estoy postulando esto para que otros no tengan tiempo en este tema.

Escribí mi primera versión, por favor hágamelo saber si encuentra algún error que necesite ser corregido. Puede controlar el comportamiento exacto con el iomanipulator. Mi función es para mostrar el número de dígitos después del punto decimal.

string ftos(float f, int nd) {
   ostringstream ostr;
   int tens = stoi("1" + string(nd, '0'));
   ostr << round(f*tens)/tens;
   return ostr.str();
}
 2
Author: Kemin Zhou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 05:39:46