C言語のきほん|浮動小数点数の表示と精度指定

小数の表示は思ったより奥深い。printf の書式と精度指定を覚えて、見やすく正確に表示しよう。

C言語で整数を表示できるようになると、次に出てくるのが小数の表示です。
たとえば、温度、金額、割合、測定値など、実際のプログラムでは小数を扱う場面がとても多いですよね。

ここで大事になるのが、printf の 浮動小数点数の表示形式精度指定 です。
同じ値でも、普通の小数として表示したり、指数付きの形で表示したり、小数点以下の桁数をそろえたりできます。

この表示方法をしっかり理解しておくと、画面表示が見やすくなるだけでなく、デバッグのときにもかなり役立ちます。
特に、丸めの動きや、精度を省略したときの表示桁数は、最初に押さえておきたいポイントです。

ここでは、%f と %e を中心に、浮動小数点数の表示と精度指定をやさしく丁寧に解説していきます。
サンプルプログラムは、内容を別のシンプルな例に変更して、日本語メッセージ・日本語コメントで説明していきます。

浮動小数点数とは

まず、用語を軽く整理しておきます。
浮動小数点数は、小数を含む数を表すためのデータです。

C言語では、主に次の型を使います。

  • float
  • double

入門では double を使うことが多いです。
理由は、float よりも表現できる範囲や精度が広く、扱いやすい場面が多いからです。

たとえば、次のような値が浮動小数点数です。

  • 3.14
  • 0.00321
  • 123.456

printf で浮動小数点数を表示する書式指定

浮動小数点数の表示で、まず覚えたい書式指定は次の3つです。

書式指定意味
%f通常の小数表記で表示123.456000
%e指数部付き表記(eは小文字)1.234560e+02
%E指数部付き表記(Eは大文字)1.234560E+02

使い分けのイメージ

  • %f:普段の小数として見せたいとき
  • %e / %E:とても大きい値・小さい値を見やすくしたいとき

特に、すごく小さい値や大きい値は %f だと桁が長くなって見づらくなることがあるので、%e が便利です。

%f は普通の小数として表示する

%f は、いちばんよく使う浮動小数点数の表示方法です。
見た目は、私たちが普段見ている小数の形に近いです。

例:

printf("%f\n", 123.456);

実行結果の例

123.456000

ここで大事なポイントは、精度を省略すると小数点以下6桁で表示される ことです。
123.456 は 123.456000 と表示されます。

%e と %E は指数部付き表記で表示する

%e と %E は、指数部付き表記で表示します。
科学技術計算や、すごく小さい数値・大きい数値を扱うときによく使います。

例:

printf("%e\n", 123.456);
printf("%E\n", 123.456);

実行結果の例

1.234560e+02
1.234560E+02

どういう意味か

1.234560e+02 は、ざっくり言うと次の意味です。

1.234560 × 10²

つまり 123.456 です。

ここでの e+02 は「10の2乗倍」を表しています。
%E を使うと、この e が大文字の E になります。

精度指定とは

浮動小数点数の表示では、小数点以下を何桁まで表示するか を指定できます。
これが精度指定です。

書き方は、% のあとに .桁数 を入れます。

書き方の基本

  • %.2f ・・・小数点以下2桁
  • %.3f ・・・小数点以下3桁
  • %.2e ・・・指数表記で小数点以下2桁

たとえば、123.456 を %.2f で表示すると、こうなります。

123.46

小数点以下3桁目(6)を見て、2桁に丸められるからです。

精度指定の動きを表で確認

値 123.456 を例にして、表示の違いを並べるとわかりやすいです。

書式表示例説明
%f123.456000省略時は小数点以下6桁
%.2f123.46小数点以下2桁に丸める
%.4f123.4560小数点以下4桁で表示
%e1.234560e+02指数表記、既定は6桁
%.2e1.23e+02指数表記で小数点以下2桁

ここでの丸めは、表示のときに行われます。
元の変数の値そのものが変わるわけではありません。

サンプルプログラムで確認しよう

ファイル名:5_4_1.c

#include <stdio.h>

int main(void)
{
    /* 表示する浮動小数点値 */
    double temperature = 23.9876;

    /* 通常の小数表記で表示する */
    printf("通常の小数表記: %f\n", temperature);

    /* 指数部付き表記で表示する */
    printf("指数付き表記  : %e\n", temperature);

    /* 精度を指定して表示する */
    printf("小数点以下2桁 : %.2f\n", temperature);
    printf("指数で2桁表示 : %.2e\n", temperature);

    return 0;
}

実行結果例

通常の小数表記: 23.987600
指数付き表記  : 2.398760e+01
小数点以下2桁 : 23.99
指数で2桁表示 : 2.40e+01

サンプルプログラムの解説

%f は省略時に小数点以下6桁

printf("通常の小数表記: %f\n", temperature);

%f で精度を指定しない場合、小数点以下6桁で表示されます。
そのため、23.9876 は 23.987600 と表示されます。

この「6桁表示」はとてもよく出てくるので、最初に覚えておくと混乱しにくいです。

%e は指数部付きで表示する

printf("指数付き表記  : %e\n", temperature);

この表示形式は、数値を 1桁台 × 10の何乗 という形に変換して表示します。
小さい値や大きい値を扱うときに見やすくなります。

%.2f は小数点以下2桁に丸める

printf("小数点以下2桁 : %.2f\n", temperature);

23.9876 を小数点以下2桁で表示すると 23.99 になります。
小数点以下3桁目が 7 なので、2桁目が切り上がるためです。

%.2e も同じく精度指定できる

printf("指数で2桁表示 : %.2e\n", temperature);

指数表記でも、%.2e のように精度指定できます。
小数点以下2桁で表示されるので、2.40e+01 のような形になります。

丸めについて知っておきたいポイント

表示の精度指定をすると、値は指定した桁数に収まるように 丸められて表示 されます。
ここで大事なのは、丸めが起きるのは「表示の段階」だということです。

イメージ

つまり、%.2f で表示したからといって、変数の中身そのものが 2桁になるわけではありません。

%f と %e のどちらを使うべき?

どちらを使っても同じ値を表示できますが、見やすさの観点で使い分けるのがおすすめです。

%f が向いている場面

  • 普段の金額や温度の表示
  • ユーザーに見せる通常の小数表示
  • 小数点の形で直感的に見せたいとき

例:

  • 24.50℃
  • 1280.75円

%e が向いている場面

  • とても小さい値(例:0.00000012)
  • とても大きい値
  • 科学技術計算の出力
  • 桁数が長くなりすぎる値の確認

例:

  • 1.20e-07
  • 3.45e+08

小さい値で見ると %e の便利さがよくわかる

ご提示の実践問題の値に近い 0.00321 のような数は、%f と %e の違いがわかりやすいです。

例:

printf("%%f で表示: %f\n", 0.00321);
printf("%%e で表示: %e\n", 0.00321);

実行結果のイメージ

%f で表示: 0.003210
%e で表示: 3.210000e-03

どちらも同じ値ですが、%e のほうは「3.21 × 10^-3」という形で見えて、桁の大きさがわかりやすくなります。

参考例として、1行で両方の形式を表示する

教材としてよく使いやすい形なので、1行で %f と %e を並べる例も載せておきます。

参考コード

ファイル名:5_4_2.c

#include <stdio.h>

int main(void)
{
    /* 小さい値を2つの形式で表示する */
    double x = 0.00321;

    printf("x = %f (%e)\n", x, x);

    return 0;
}

実行結果例

x = 0.003210 (3.210000e-03)

ここからさらに、指数表記の桁数をそろえたいなら %.3e のように調整できます。

printf("x = %.6f (%.3e)\n", x, x);

実行結果例

x = 0.003210 (3.210e-03)

この形は、通常表記と指数表記を同時に確認できるので、学習にもデバッグにも便利です。

書式指定の見方を図で整理

書式指定は、% から始まる小さなルールの集まりです。
今回はまず、次の形を覚えると十分です。

%f      → 浮動小数点数を通常表示
%e      → 浮動小数点数を指数表示
%.2f    → 小数点以下2桁で通常表示
%.3e    → 小数点以下3桁で指数表示

図で見るとこんなイメージです。

この形に慣れると、%.1f、%.4f、%.2e なども自然に読めるようになります。

よくあるミスと注意点

精度指定を忘れて桁数が多く見える

%f や %e は、精度を省略すると小数点以下6桁で表示されます。
そのため、「思ったより桁が多い」と感じることがあります。

必要に応じて、%.2f や %.3f のように精度指定を付けると見やすくなります。

%d を使ってしまう

浮動小数点数を表示するのに %d を使うのはNGです。
%d は整数用の書式指定なので、double には %f や %e を使います。

  • int → %d
  • double → %f / %e

この対応をしっかり覚えておくのが大切です。

丸めで値が変わったと勘違いする

%.2f で表示して 23.99 になったとしても、変数の中身が 23.99 に変わったわけではありません。
表示がそう見えているだけです。

ここは最初に少し混乱しやすいので、
表示形式の問題変数に入っている値 は分けて考えるのがおすすめです。

表示の見やすさはプログラムのわかりやすさにつながる

printf の書式指定は、単に値を表示するための機能ではなく、読みやすい出力を作るための道具 でもあります。

  • ユーザー向けには %.2f で見やすく
  • デバッグ時には %e で桁の大きさを確認
  • 必要な場面だけ桁数を増やして精度を確認

こんなふうに使い分けられるようになると、プログラムの出力が一気に見やすくなります。

浮動小数点数は、整数より少しだけ扱いが難しく感じる部分もありますが、printf の %f、%e、精度指定を使いこなせるようになると、かなり安心して扱えるようになります。