2011-03-06 103 views
37
double x = 1500; 
for(int k =0; k<10 ; k++){ 
    double t =0; 
    for(int i=0; i<12; i++){ 
     t += (double) x * 0.0675; 
     x += (double) x * 0.0675; 
    } 
    cout<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;  
} 

这个输出如何使C++的cout不能用科学记数法

巴斯语录:3284.78儿子法伊兹:1784.78儿子语录:5069.55

巴斯语录:7193.17儿子法伊兹:3908.4儿子ANA :11101.6

巴斯语录:15752儿子法伊兹:8558.8儿子语录:24310.8

巴斯语录:34494.5儿子法伊兹:18742.5儿子语录:53237

巴斯语录:75537.8儿子法伊兹:41043.3儿子语录:116581

巴斯语录:165417儿子法伊兹:89878.7儿子语录:255295

巴斯语录:362238儿子法伊兹:196821儿子语录:559059

巴斯ANA:793246子法伊兹:431009子ANA:1.22426e + 006

巴斯ANA:1.73709e + 006子法伊兹:943845子ANA:2.68094e + 006

巴斯ana:3.80397e + 006子faiz:2.06688e + 006子ana:5.87085e + 006

我希望数字显示的确切数字不是科学数字。我怎样才能做到这一点?

+6

你为什么要把'double'改成'double'? – 2011-03-06 17:18:14

+2

[使用双引号时防止ostream中的科学记数法](http://stackoverflow.com/questions/2335657/prevent-scientific-notation-in-ostream-when-using-with-double) – 2012-08-22 03:38:06

回答

57

使用std::fixed流处理器:

cout<<fixed<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl; 
1

有格式化操作符,你的iostream获得的整个集合。这里有一个tutorial让你开始。

14

正如上面提到的,你可以使用std ::固定的解决您的问题,如:

cout << fixed; 
cout << "Bas ana: " << x << "\tSon faiz: " << t << "\tSon ana: " << x+t <<endl; 

但是,你这样做后, ,每次在项目中的任何位置打印浮点数或双精度浮点数时,编号仍将以此固定符号打印。你可以将其重新使用

cout << scientific; 

,但如果你的代码变得更加复杂,这可能变得单调乏味。

这就是为什么升压作出I/O流状态节电器,它会自动返回您使用的是它是你的函数调用之前的状态的I/O流。您可以使用它像这样:

#include <boost/io/ios_state.hpp> // you need to download these headers first 

{ 
    boost::io::ios_flags_saver ifs(os); 

    cout << ios::fixed; 
    cout<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl; 

} // at this bracket, when ifs goes "out of scope", your stream is reset 

你可以找到关于Boost的I/O流状态保存在the official docs更多信息。

您可能还想查看Boost Format library这也可以使您的输出更容易,尤其是如果你必须处理国际化。但是,它不会帮助你解决这个问题。