9.3 控制浮點數輸出格式:fixed 與 setprecision
預設輸出會刪零、會轉科學記號,全都自作主張——但有些競程題目會明確要求,輸出的小數必須固定顯示到小數點後 k 位。要讓 cout 照辦,靠兩個工具(setprecision 住在 <iomanip> 函式庫;fixed 其實有 <iostream> 就能用,兩個一起用時記得 #include <iomanip>):
cout << fixed;:從此之後,浮點數一律用「一般小數」的樣子印,不再使用科學記號。cout << setprecision(k);:搭配fixed時,固定顯示小數點後 k 位(不足補 0;超過的部分取最接近的值——絕大多數情況就等同四捨五入,「剛好一半」的例外見下方的〔四捨六入五成雙〕框)。
兩個常常連寫成一行,設定一次、終身有效(直到你改設定為止):
cout << fixed << setprecision(3); // 之後所有浮點數都印小數點後 3 位
¶範例程式碼
固定位數輸出練習題要求把 \frac{B}{A} 四捨五入到小數點後三位輸出:
#include <iostream>
#include <iomanip> // setprecision 住在這(fixed 有 iostream 就夠)
using namespace std;
int main() {
double A, B;
cin >> A >> B;
cout << fixed << setprecision(3);
cout << B / A << '\n';
return 0;
}
執行結果(輸入 3 2):
0.667
\frac{2}{3} = 0.6666\ldots,第四位四捨五入進上來變成 0.667——正是題目要的。再看幾組設定的效果:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double x = 0.00001234567;
cout << fixed << setprecision(12);
cout << x << '\n'; // 不再是科學記號,小數點後 12 位
cout << 25.0 << '\n'; // 補零補好補滿
cout << defaultfloat << 25.0 << '\n'; // 恢復預設模式
return 0;
}
執行結果:
0.000012345670
25.000000000000
25
最後一行示範了 defaultfloat:把輸出模式改回預設。競程幾乎用不到它(整份程式從頭 fixed 到尾就好),但知道「設定是可以改回來的」總是好事。
動手試試看:讀入一個小數,輸出「取到小數點後一位」的結果——不用任何數學函式,fixed 加 setprecision 就寫完了。寫好後拿 0.25、0.75 餵餵看,親眼驗證〔四捨六入五成雙〕框講的行為。最後做一個 9.1 當時還做不了的實驗:把 9.1 範例的 double 改成 float,輸入 1.000001,輸出前加上 cout << fixed << setprecision(12);——double 版印出 1.000002000001,float 版卻印出 1.000001907349,第 7 位有效數字之後就開始亂編。9.1 說 float 精度太低,現在你有工具親眼驗證了。