2011-02-25 31 views
22

Tôi có một loạt các số nguyên mà tôi đưa vào stringstream s. Bây giờ tôi muốn thay đổi stringstream s thành string s trong khi vẫn giữ độ chính xác không đổi với string s. Tôi sẽ làm như thế nào? Tôi biết tôi có thể sử dụng stringstreams.precision(), nhưng nó không làm việc vì một lý do:Điểm thập phân với 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"; 

Sẽ trở lại 5.23\n3.134\n3.0, chứ không phải là 5.23\n3.13\n3.00

Trả lời

43

Tôi nghĩ rằng vấn đề của bạn là precision() đặt chính xác được sử dụng trong các hoạt động chèn dòng tương lai , không phải khi tạo chuỗi cuối cùng để trình bày. Đó là, bằng cách viết

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

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

Bạn đang thiết precision quá muộn, như ba dòng đầu tiên đã chuyển đổi các số dấu chấm động đến chuỗi bằng cách sử dụng chính xác mặc định.

Để sửa lỗi này, hãy thử thay đổi thứ tự mà bạn thực hiện các báo cáo để

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

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

này sẽ làm cho ghi vào stringstream sử dụng chính xác tùy chỉnh của bạn chứ không phải là giá trị mặc định hiện có.

Tuy nhiên, hiệu ứng của công cụ sửa đổi precision chỉ có ý nghĩa nếu bạn nói rõ ràng luồng mà bạn muốn sử dụng ký hiệu khoa học chính xác hoặc cố định cho đầu ra. Để làm điều này, bạn có thể sử dụng một trong hai fixed hoặc scientific bổ:

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

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

này một cách chính xác sẽ hiển thị số thích hợp chữ số.

Trên ghi chú có liên quan, bạn không cần sử dụng ba stringstream giây để hoàn thành mục tiêu của mình. Bạn chỉ có thể sử dụng một:

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

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

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

cảm ơn, nhưng nó không hoạt động. im vẫn nhận được '3.0' thay vì' 3.00' – noobcpp

+0

@ noobcpp- Rất tiếc! Lỗi của tôi. Tôi vừa cập nhật điều này để đề cập rằng bạn cần sử dụng chế độ 'cố định' hoặc' khoa học' trên chuỗi. Hãy thử thực hiện thay đổi đó và xem nó có khắc phục được không. – templatetypedef

+0

+1. @noobcpp: Ngoài ra, hãy kiểm tra: http://www.cplusplus.com/reference/iostream/ios_base/precision/ (mặc dù họ nói để sử dụng 0 ở một nơi mang lại cho tôi một lỗi trình biên dịch). –

Các vấn đề liên quan