2011-02-25 42 views
22

我有一堆整数,我把它放入stringstream s。现在我想将stringstream s更改为string s,同时保持与string s的恒定精度。我会怎么做?我知道我可以使用stringstreams.precision(),但它不工作的一些原因:小数点与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"; 

将返回5.23\n3.134\n3.0,而不是5.23\n3.13\n3.00

回答

43

我认为你的问题是,precision()将在未来的流插入操作中使用的精确度,而不是在生成最后一个字符串时出现。也就是说,通过写

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

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

你设置precision为时已晚,为第一三线已经转换的浮点数使用默认精度字符串。

要解决这个问题,请尝试更改您在其中执行这些语句来

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

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

这将导致写入stringstream能够使用自定义精度而非现有默认顺序。

但是,precision修饰符的效果仅在您明确告诉流要使用固定精度或科学记数法输出时才有意义。要做到这一点,您可以使用该fixedscientific修饰符:

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

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

这将正确显示的数字适当数量。

在相关说明中,您不需要使用三个stringstream即可完成您的目标。你可以用一个:

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

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

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

谢谢,但它不工作。即时通讯仍然获得'3.0'而不是'3.00' – noobcpp

+0

@ noobcpp-哎呀!我的错。我只是更新了这一点,提到你需要在字串流上使用'fixed'或'scientific'模式。尝试做出改变,看看它是否修复了一些事情。 – templatetypedef

+0

+1。 @noobcpp:另外,看看:http://www.cplusplus.com/reference/iostream/ios_base/precision/(尽管他们说在一个给我编译器错误的地方使用0)。 –

相关问题