2011-02-25 13 views
22

Tengo un montón de enteros que puse en stringstream s. Ahora quiero cambiar el stringstream s en string s manteniendo una precisión constante con el string s. ¿Como podría hacerlo? Sé que puedo utilizar stringstreams.precision(), pero que no funciona por alguna razón:Puntos decimales con std :: stringstream?

float a = 5.23; 
float b = 3.134; 
float c = 3.0; 

std::stringstream ta; 
std::stringstream tb; 
std::stringstream tc; 

ta << a; 
tb << b; 
tc << c; 

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

std::string out = ""; 
out += ta.str() + "\n"; 
out += tb.str() + "\n"; 
out += tc.str() + "\n"; 

Will volver 5.23\n3.134\n3.0, en lugar de 5.23\n3.13\n3.00

Respuesta

43

Creo que su problema es que precision() establece la precisión utilizado en operaciones de inserción flujo futuro , no cuando se genera la cadena final para presentar. Es decir, escribiendo

ta << a; 
tb << b; 
tc << c; 

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

está configurando precision demasiado tarde, ya que las tres primeras líneas ya se han convertido los números de punto flotante de cadenas utilizando la precisión predeterminada.

Para solucionar este problema, intente cambiar el orden en el que se ejecuta estas declaraciones a

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

ta << a; 
tb << b; 
tc << c; 

Esto hará que las escrituras en el stringstream utilizar su precisión a medida en lugar de los valores predeterminados existentes.

Sin embargo, el efecto del modificador precision solo tiene sentido si le indica explícitamente a la transmisión que desea usar la notación científica o de precisión fija para la salida. Para ello, puede utilizar cualquiera de los fixed o scientific modificadores:

ta.precision(2); 
tb.precision(2); 
tc.precision(2); 

ta << fixed << a; 
tb << fixed << b; 
tc << fixed << c; 

Esto mostrará correctamente el número apropiado de dígitos.

En una nota relacionada, no necesita utilizar tres stringstream s para lograr su objetivo. Solo puede usar uno:

std::stringstream t; 
t.precision(2); 

t << fixed << a << '\n' << b << '\n << c << '\n'; 

std::string out = t.str(); 
+2

gracias, pero no está funcionando. todavía estoy recibiendo '3.0' en lugar de' 3.00' – noobcpp

+0

@ noobcpp- ¡Vaya! Mi error. Acabo de actualizar esto para mencionar que necesitas usar el modo 'fijo' o' científico' en las cadenas de caracteres. Intenta hacer ese cambio y ve si arregla las cosas. – templatetypedef

+0

+1. @noobcpp: También, consulte: http://www.cplusplus.com/reference/iostream/ios_base/precision/ (aunque dicen que use 0 en un lugar que me está dando un error de compilación). –

Cuestiones relacionadas