今天呢,有人問我關於乙個c++浮點數輸出精度的問題,畢竟到現在我也還沒怎麼去考量那些操作符,也就一時沒答上來,查了一下,回答了那個問題,也順便做個整理,整體的關於那些輸出的manipulator。
首先是那個不太對的**
她後面的期望輸出呢是6位有效數字,然而呢,shell只把乙個3.3和另乙個2輸出就好了#include #include using namespace std;
int main()
輸出:
為了揭示這背後只有乙個的真相呢,我呼叫我的上課時間,關於c++的格式化輸出進行了一些網路上的查詢,然而,效果不好。3.2999999999999998
3.14
1.008
2
好不容易探明了這古怪的真相——輸出流輸出的時候把你最後的零吃掉了啦!!!那個可愛的setprecision(n)函式只是使後面的保證輸出的有效數字不超過n罷了,真正要把零顯示出還是要靠可愛的showpoint:
cout << showpoint << setprecision(6) << pi << endl;
輸出:
這就符合要求了嘛。3.2999999999999998
3.14000
1.00800
2.00000
順著這個,我們繼續探索一些其他的manipulator。
現在第一小組入場了,看吶,他們揮舞著手中的小彩旗,盡顯年輕風采,鬥志…(啪)
第一小組
操作符作用ends
cout清空輸出流
endl
換行並flush,嗯,等價於cout << '\n' << flush
首先是ends
cout << showpoint << setprecision(6) << pi << ends << 2.1 << '\0' << 2.1 << 2.1;
輸出:3.14000 2.10000 2.100002.10000
inserts a null character.本來也想搞個flush的例子的,但,根本沒……,暫時想不到什麼把東西塞進流不讓他輸出然後清空他的辦法
endl太常用,算了。
接下來進場的是第二小組!它們有著神奇的化身,他們一位兩體!(啪)
第二小組
流成員函式
對應控制符
特效precision(int)
setprecision(int)
設定浮點數十進位制精度值
width(int)
setw(int)
設定字段寬度(僅下乙個輸出)
fill(char)
setfill(char)
設定填充字元
setf(int)
setiosflags(int)
設定格式標誌(後面會提到各類格式表示)
unsetf(int)
resetiosflags(int)
取消某格式標誌的設定
precision在最初已經用過了,下面幾個讓我們依次玩一玩。
const double pi = 3.14;
const double p = 3.3;
double i = 2;
cout.width(6);
cout << pi << endl;
輸出為:cout << setw(8) << p << endl;
cout << setfill('*') << setw(7) << i << endl;
很可愛吧!預設佔位符為空,並且setw是只能應用到下乙個輸出的,然後數一數輸出的空和數字小數點,加起來一共就是6個,8個,7個字元了呢。3.14
3.32******2
輸出為cout << setiosflags(ios::left) << setw(10) << pi << endl;
cout << resetiosflags(ios::left) << setw(10) << pi << endl;
看!佔位符到後面了,這裡就用了乙個格式標誌ios::left,一取消,又到前面了,格式標誌後面會介紹的3.14******
******3.14
第三小組!!
識別符號(其實也幾乎全是格式標誌,只要前面加個ios::)
特效(duangduangduang)
boolalpha / noboolalpha
將之後的布林型別值輸出為true/false
showbase / noshowbase
強制輸出整數的基數
showpoint / noshowpoint
強制輸出省略的零和小數點
showpos / noshowpos
強制輸出+
unitbuf / nounitbuf
每次輸出後自動flush
uppercase / nouppercase
輸出十六進製制時,abcdef大寫
dec / hex / oct
強行改整數輸出進製
fixed / scientific / hexfloat / defaultfloat
強行輸出為:定點小數,科學記數法,十六進製制浮點數,預設浮點數輸出格式
left/right/internal(補一行)
你知道的啦,左對齊右對齊什麼的,最後那個是符號左對齊,數字右對齊
遊戲開始!
輸出bool tru = true, fals = false;
cout << boolalpha << tru << 1 << endl << fals << endl;
**:true1
false
cout << hex << 13 << endl << showbase << 13 << endl << oct << 143 << endl;
輸出:**:d
0xd0217
輸出cout << setprecision(9) << pi << endl;
cout << showpoint << pi << endl;
cout << i << endl;
cout << noshowpoint << pi << endl;
cout << i << endl;
**:3.14
3.14000000
2.00000000
3.14
2
輸出:cout << pi << endl;
cout << showpos << pi << endl;
cout << 1.008 << endl;
3.14
+3.14
+1.008
最後測一下fixed什麼的
輸出:cout << fixed << pi << endl;
cout << scientific << pi << defaultfloat << endl;
cout << hexfloat << pi << endl;
喵喵喵?那個浮點十六進製制數我看不懂你啊。3.140000
3.140000e+000
0x1.91eb85p+1
ok,就這樣吧,也挺全了,應該吧
cout格式化輸出 C
由於class ifstream ofstream分別為class istream ostream派生來的,所以,下面介紹的cout輸出的格式化,在檔案的輸出時使用方法相同。由於使用iostream工具來設定一些格式值不太方便,為簡化工作,c 在標頭檔案iomanip中提供了一些控制符,他們能夠提供...
cout格式化輸出
在使用setf等庫函式時使用 在使用流操縱運算元時使用 using namespace std 以下所有的setf 都有對應的unsetf 用於取消設定 所有的setiosflags 可以用resetiosflags 取消 標誌位fmtflags的命名空間可以使用ios base 或者ios int...
cout格式化輸出
需要引入的標頭檔案 include在使用流操縱運算元時使用 int laneri 12345 double lanerd 56789 1 設定整數進製輸出 過載1 fmtflags ios base setf fmtflags mask 過載2 fmtflags ios base setf fmtf...