2011-03-06 105 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這也可以使您的輸出更容易,尤其是如果你必須處理國際化。但是,它不會幫助你解決這個問題。