transformar stof float convertir c++ string floating-point

c++ - stof - ¿Convertir flotante a cadena con precisión y número de dígitos decimales especificados?



string to int c++ (5)

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

Por ejemplo: 3.14159265359 -> "3.14"


Aquí proporciono un ejemplo negativo en el que desea evitar al convertir un número flotante 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 punto es evitar la conveniente función "to_string" de c ++ 11. Me tomó un tiempo sacar esta trampa. La mejor forma es mediante los métodos stringstream y sprintf (lenguaje C). C ++ 11 o posterior debería 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 pierdan el tiempo en este tema.

Escribí mi primera versión, 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(); }


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();


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 written < 0 .


Puede usar la función fmt::format de la biblioteca {fmt} :

#include <fmt/core.h> int main() std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14" }

donde 2 es una precisión.

Esta facilidad de formateo se ha propuesto para la estandarización en C ++: P0645 . Tanto P0645 como {fmt} usan una sintaxis de cadena de formato similar a Python que es similar a la de printf pero usa {} como delimitadores en lugar de % .


Una forma típica sería usar stringstream :

#include <iomanip> #include <sstream> double pi = 3.14159265359; std::stringstream stream; stream << std::fixed << std::setprecision(2) << pi; std::string s = stream.str();

Ver fixed

Usar notación de punto flotante fijo

Establece el floatfield formato de campo floatfield para la secuencia str en fixed .

Cuando floatfield se establece en fixed , los valores de punto 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 de exponente.

y establecer setprecision .

Para las conversiones de fines técnicos , como el almacenamiento de datos en archivos XML o JSON, C ++ 17 define la familia de funciones to_chars .

Suponiendo un compilador compatible (que nos falta al momento de escribir), se puede considerar algo como esto:

#include <array> #include <charconv> double pi = 3.14159265359; std::array<char, 128> buffer; auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi, std::chars_format::fixed, 2); if (ec == std::errc{}) { std::string s(buffer.data(), ptr); // .... } else { // error handling }