2011-02-25 16 views
22

Ho un sacco di numeri interi che inserisco in stringstream s. Ora voglio cambiare il stringstream s in string s mantenendo una precisione costante con il string s. Come potrei farlo? So che posso usare stringstreams.precision(), ma non funziona per qualche motivo:Punti decimali 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"; 

tornerà 5.23\n3.134\n3.0, piuttosto che 5.23\n3.13\n3.00

risposta

43

Penso che il tuo problema è che precision() imposta la precisione utilizzato nelle future operazioni di inserimento flusso , non quando si genera la stringa finale da presentare. Cioè, scrivendo

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

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

Stai impostando precision troppo tardi, come le prime tre righe hanno già convertito i numeri in virgola mobile in stringhe utilizzando la precisione di default.

Per risolvere questo problema, provare a cambiare l'ordine in cui si esegue queste dichiarazioni a

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

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

Questo farà sì che le scrive sulle stringstream di utilizzare il vostro precisione personalizzato piuttosto che le impostazioni predefinite esistenti.

Tuttavia, l'effetto del modificatore è significativo solo se si specifica esplicitamente al flusso che si desidera utilizzare la notazione a precisione fissa o scientifica per l'output. Per fare questo, è possibile utilizzare sia le fixed o scientific modificatori:

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

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

Ciò visualizzerà correttamente il numero appropriato di cifre.

Su una nota correlata, non è necessario utilizzare tre stringstream s per raggiungere l'obiettivo. Si può semplicemente usare uno:

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

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

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

grazie, ma non funziona. Sto ancora ottenendo '3.0' anziché' 3.00' – noobcpp

+0

@ noobcpp- Whoops! Errore mio. Ho appena aggiornato ciò per menzionare che è necessario utilizzare la modalità 'fixed' o' scientific' sulle stringhe. Prova a fare quel cambiamento e vedi se risolve le cose. – templatetypedef

+0

+1. @noobcpp: Inoltre, controlla: http://www.cplusplus.com/reference/iostream/ios_base/precision/ (anche se dicono di usare 0 in un posto che mi sta dando un errore del compilatore). –

Problemi correlati