洛谷 P5706 【深基2.例8】再分肥宅水
阿新 • • 發佈:2022-04-02
題目連線:
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卻不行。
總結:
- 如果cout要控制小數點位數,那麼使用setprecision時要加上fixed;
- fixed對setprecision都有效果,對setw沒有。
- setw只對下一個輸出值有效,而setprecision對後面的輸出都有效。