1. 程式人生 > 其它 >洛谷 P5706 【深基2.例8】再分肥宅水

洛谷 P5706 【深基2.例8】再分肥宅水

題目連線:

P5706 【深基2.例8】再分肥宅水 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

 

我提交的:

 1 #include<iostream>
 2 #include<iomanip>
 3 using namespace std;
 4 int main(){
 5     float a;
 6     int b;
 7     cin >> a >> b;
 8     
 9     cout << setprecision(3) << a / b << endl;
10     cout << b * 2
<< endl; 11 }

然而,只有一個AC,思考良久,不知為何而錯。無奈看了看題解,發現人家比我多了一個"fixed"。那這個"fixed"到底是什麼呢?

網上尋找了一圈,看見人家說:“如果一個數字太大,無法使用 setprecision 指定的有效數位數來列印,則許多系統會以科學表示法的方式列印。”

經過嘗試後,發現果真如此:

 

所以應該加上fixed來控制位數。

那麼,為什麼setprecision不能這樣輸出呢?我又找了一圈,我發現我對setprecision的理解完全錯了。

我過去曾認為:setprecision就是傳統意義上,按照我們人腦控制的小數點位數。結果好像跟setw一樣的效果,都是控制總有效位數?

 

現在,問題來到了setw和setprecision的區別:

setw(n): 右對齊,不夠位數左邊加空格,可以用setfill()來控制左邊填充的東西

setprecision(n): 左對齊,不夠位數不填充,對於小數點後的0會自動省略。

    double a = 123.321;
    double b = 32.21;
    //cin >> a >> b;
    double num = a / b;
    cout << "結果:" << endl;
    cout << fixed << setw(6
) << num << endl; //看看是不是對setw有效 cout << setprecision(6) << num << endl; cout << num << endl; //看看是不是對下面也有效 cout << setprecision(2) << num << endl; cout << num << endl; //確實有效 cout << setprecision(1) << num << endl;
  cout.setf(ios::fixed);  //加上這一句也可以
結果:
3.828656
3.828656
3.828656
3.83
3.83
3.8

D:\C++程式\try1\Debug\try1.exe (程序 63548)已退出,程式碼為 0。
要在除錯停止時自動關閉控制檯,請啟用“工具”->“選項”->“除錯”->“除錯停止時自動關閉控制檯”。
按任意鍵關閉此視窗. . .

結論:加上fixed後,經過嘗試,setpricision可以控制小數位數,但是setw卻不行。

 

總結:

  1. 如果cout要控制小數點位數,那麼使用setprecision時要加上fixed;
  2. fixed對setprecision都有效果,對setw沒有。
  3. setw只對下一個輸出值有效,而setprecision對後面的輸出都有效。