Convierte float en string con la precisión establecida y la cantidad de dígitos decimales?

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

Por ejemplo: 3.14159265359 -> "3.14"

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

Ver fijo

Use notación fija de coma flotante

Establece el floatfield formato de campo floatfield para la transmisión str a fixed .

Cuando floatfield se establece en fixed , los valores de coma flotante se escriben usando 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 precision ( precision ) y sin parte exponente.

y setprecision .

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

 std::stringstream ss; ss < < std::fixed << std::setprecision(2) << number; std::string mystring = ss.str(); 

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, verificar por written < 0 .

Aquí proporciono un ejemplo negativo en el que 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; 

Usted obtiene

 99463 99.463 99.462997 

Nota: la variable num puede ser cualquier valor cercano a 99.463, obtendrá la misma impresión. El objective es evitar la función conveniente de c ++ 11 "to_string". Me tomó un tiempo salir de esta trampa. La mejor forma es con los métodos stringstream y sprintf (lenguaje C). C ++ 11 o más nuevo 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 planteando esto para que los demás no pierdan el tiempo en este tema.

Escribí mi primera versión, por favor avíseme si encuentra algún error que deba corregirse. Puede controlar el comportamiento exacto con el iomanipulator. Mi función es 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(); }