語法書 / AA 競程語法書 下冊 / 第九單元 / 控制浮點數輸出格式:fixed 與 setprecision

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 到尾就好),但知道「設定是可以改回來的」總是好事。

動手試試看:讀入一個小數,輸出「取到小數點後位」的結果——不用任何數學函式,fixedsetprecision 就寫完了。寫好後拿 0.250.75 餵餵看,親眼驗證〔四捨六入五成雙〕框講的行為。最後做一個 9.1 當時還做不了的實驗:把 9.1 範例的 double 改成 float,輸入 1.000001,輸出前加上 cout << fixed << setprecision(12);——double 版印出 1.000002000001float 版卻印出 1.000001907349,第 7 位有效數字之後就開始亂編。9.1 說 float 精度太低,現在你有工具親眼驗證了。