HOWTO · C++

C++ で指定された小数点で数値を出力する方法

この記事では、C++ で指定された小数点の数値を出力する方法を紹介します

このページの内容

浮動小数点値を小数点以下の桁数を指定して出力するには、std::cout に std::fixed の後で std::setprecision(n) を指定します。たとえば、std::fixed << std::setprecision(2) とすると、小数点以下2桁で値を表示できます。出力には <iostream>、これらのマニピュレーターには <iomanip> をインクルードします。

std::fixed と std::setprecision を使う

std::fixed は固定小数点表記を選択します。この形式では、std::setprecision(n) によって小数点以下の桁数が決まり、表示時に値が丸められ、必要に応じて末尾にゼロが補われます。std::fixed を指定しない場合、std::setprecision(n) は有効桁数を指定します。詳しくはsetprecision ガイドをご覧ください。

次の完全なプログラムをコンパイルして実行します。コードと表示例は変更せず、表示されるラベルも英語のままです。

#include <iomanip>
#include <iostream>

int main() {
    const double values[] = {3.14159, 2.5, 0.004};
    std::cout << std::fixed << std::setprecision(2);

    for (double value : values) {
        std::cout << value << '\n';
    }
}
3.14
2.50
0.00

最初の値は表示時に丸められ、2つ目の値には小数部の末尾の桁が表示され、3つ目の値も同じく小数点以下2桁で整形されます。整形によって変わるのは表示形式であり、保存されている値が変わったり、浮動小数点演算が正確になったりするわけではありません。小数点以下3桁で表示するには、std::setprecision(3) を使います。

ストリームでは、std::fixed と設定した精度が、その後に挿入される浮動小数点値にも引き継がれます。後続の値を別の桁数で表示する場合は、精度を改めて設定してください。これらのマニピュレーターは <iomanip> で宣言されています。

std::setw と std::setfill で値を揃える

列を揃える場合、std::setw(width) は次に挿入する値の最小フィールド幅を設定します。幅に収まらない値が切り詰められることはなく、値を挿入すると幅はリセットされます。std::setfill(ch) は埋め込みに使う文字を選び、変更するまで有効です。数値は既定で右揃えになります。

次の完全な例では、ピリオドを埋め込み文字として使い、それぞれの整形済み数値を幅8文字のフィールドに表示します。コードと表示例は変更せず、表示されるラベルも英語のままです。

#include <iomanip>
#include <iostream>

int main() {
    std::cout << std::fixed << std::setprecision(2) << std::setfill('.')
              << std::setw(8) << 12.5 << '\n'
              << std::setw(8) << 3.75 << '\n';
}
...12.50
....3.75

フィールド幅を指定したい値ごとに std::setw を適用してください。埋め込み文字を変えても、幅は設定されません。符号、数字、小数点、想定する小数部の桁数が収まる幅を選びます。

printf で整形する

C++ のプログラムでは、<cstdio> の printf も使えます。書式文字列の %.2f は、浮動小数点値を小数点以下2桁で表示します。桁数を変えるには、2 を別の数値に置き換えます。コードと表示例は変更せず、表示されるラベルも英語のままです。

#include <cstdio>

int main() {
    const double value = 1.41421;
    std::printf("Number with two decimal places: %.2f\n", value);
}
Number with two decimal places: 1.41

printf では、%f が double 引数に対応する浮動小数点変換指定子です。書式指定子と引数の型を一致させる必要があり、組み合わせが誤っていると未定義動作になることがあります。この例は単体で完結する C++ プログラムで、ストリーム用のヘッダーは必要ありません。

C++ のストリームと printf の選び方

ほかのストリームへの挿入と組み合わせて使い、各値の型を保ったまま書式設定したい場合は、std::cout と std::fixed、std::setprecision を使います。既存の printf 形式の書式文字列を使う場合や、その構文のほうが便利な場合は printf を選べます。どちらも C++ で使用できます。

小数点以下の桁数を指定するには、std::fixed と std::setprecision を組み合わせてください。既定のストリーム形式では、精度マニピュレーターだけでは意味が異なります。列の埋め合わせには std::setw と std::setfill を使います。std::setw の幅は一度だけ適用されるため、値ごとに指定し直してください。