記事内にはプロモーションが含まれています

【C言語】小数を表示する方法!桁数指定や計算結果が0になる時の対処法

【C言語】小数を表示する方法!桁数指定や計算結果が0になる時の対処法 C言語

C言語で数値計算を行う際、避けて通れないのが「小数(浮動小数点数)」の扱いです。

単に数値を表示するだけでも、

「小数点以下を2桁だけにしたい」
「計算したはずなのに 0.000000 と表示されてしまう」
「末尾の余分な0を消したい」

・・・など、多くの疑問やトラブルに直面することがあります。

この記事では、C言語における小数の基本的な表示方法から、printf 関数のフォーマット指定子を使った桁数制御、そして初心者が陥りやすい計算ミスの原因と対策まで、年現在の開発環境に合わせて徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

小数を表示する基本:printfと変換指定子

C言語で変数の値を画面に表示するには、標準ライブラリの printf 関数を使用します。

このとき、整数の場合は %d を使いますが、小数の場合は変数の型(floatdouble)に合わせた「変換指定子」の理解が重要です。

float型もdouble型も基本は %f を使う

実は printf 関数において、float 型と double 型の出力にはどちらも %f を使用するのが基本です。

  • float型(単精度浮動小数点数): %f
  • double型(倍精度浮動小数点数): %f%lf も使用可能)

C言語の仕様上、printf のような可変長引数の関数に float 型を渡すと、自動的に double 型に変換(昇格)されてから処理されます。

そのため、昔から double 型の出力には %f が使われてきました。

C99規格以降では %lf も明示的に許可されましたが、入力(scanf)では float%f)と double%lf)を厳密に区別する必要があるため、混同しないよう注意が必要です。

#include <stdio.h>

int main(void) {
    float f_num = 3.14159f;
    double d_num = 123.456789;

    // そのまま表示(デフォルトは小数点以下6桁)
    // double型も %f で表示できます
    printf("float型 : %f\n", f_num);
    printf("double型: %f\n", d_num);

    return 0;
}

実行結果

float型 : 3.141590
double型: 123.456789

%f を指定して出力すると、デフォルトでは小数点以下6桁まで表示されます。

桁が足りない場合は 3.141590 のように0で埋められ、桁が多い場合は7桁目以降が丸められて表示されます。

小数点以下の桁数を指定して表示する方法

「円周率を3.14と表示したい」「金額計算で小数点第2位まで出したい」という場合、デフォルトの6桁表示では不便です。

printf の指定子に少し書き加えるだけで、表示する桁数を自由にコントロールできます。

「%.2f」で小数点第2位まで表示する

%f の間に .(ドット)数字 を記述することで、小数点以下の表示桁数を指定できます。

  • %.0f: 小数点以下を表示しない(丸めて整数のように表示)
  • %.2f: 小数点第2位まで表示
  • %.4f: 小数点第4位まで表示
#include <stdio.h>

int main(void) {
    double pi = 3.1415926535;

    printf("そのまま: %f\n", pi);
    printf("第2位まで: %.2f\n", pi); // 3位を丸める
    printf("第4位まで: %.4f\n", pi); // 5位を丸める
    printf("整数表示 : %.0f\n", pi); // 1位を丸める

    return 0;
}

実行結果

そのまま: 3.141593
第2位まで: 3.14
第4位まで: 3.1416
整数表示 : 3

%.2f と指定すると、小数点第3位が丸められ、第2位までが表示されます。

ここで重要なのは、あくまで「表示上」丸められているだけで、変数 pi の中身自体が書き換わったわけではないという点です。

【注意】丸め処理について
多くの環境では「四捨五入」ではなく「最近接偶数への丸め(銀行家の丸め)」が採用されています。
これは「ちょうど中間の値(x.5)は偶数側に丸める」というルールです。
(例: 2.52, 3.54
厳密な四捨五入が必要な場合は注意してください。
【注意】精度の限界
float は約7桁、double は約15桁程度の精度しかありません。
これを超える桁数を指定しても、正確な値は表示されません。

全体の幅と0埋めを指定する (%05.2fなど)

桁揃えのために「全体の文字数」を指定したり、空白を0で埋めたりすることも可能です。

  • %6.2f: 全体を6文字分確保し、そのうち小数点以下は2桁(右詰め、空きはスペース)
  • %06.2f: 全体を6文字分確保し、空きスペースを0で埋める
#include <stdio.h>

int main(void) {
    double num = 9.5;

    // 全体5文字、小数2桁(9.50 は4文字なので先頭にスペース1つ)
    printf("幅指定  : [%5.2f]\n", num);

    // 全体5文字、小数2桁、0埋め
    printf("0埋め   : [%05.2f]\n", num);

    return 0;
}

実行結果

幅指定  : [ 9.50]
0埋め   : [09.50]

%5.2f の「5」は、小数点を含む全体の文字数です。
「9.50」は4文字なので、左側に1文字分のスペースが入ります。

%05.2f とすることで、そのスペースが 0 に置き換わります。
CSVデータの出力や、帳票の整形などで役立つテクニックです。

「計算結果が0になる」「表示がおかしい」時の原因と対策

C言語の初心者が最もハマりやすいのが、「割り算の結果が0になってしまう」あるいは「小数点以下が正しく計算されない」という問題です。

整数同士の割り算は「整数」になる罠

以下のコードを見てください。

5 / 22.5 になるはずですが、C言語ではそうなりません。

#include <stdio.h>

int main(void) {
    int a = 5;
    int b = 2;
    double result;

    // 失敗例
    result = a / b;
    printf("失敗: %f\n", result);

    // 成功例(キャストを使用)
    result = (double)a / b;
    printf("成功: %f\n", result);

    // 成功例(実数を直接記述)
    printf("直接: %f\n", 5.0 / 2.0);

    return 0;
}

実行結果

失敗: 2.000000
成功: 2.500000
直接: 2.500000

C言語では、「整数 ÷ 整数」の結果は「整数(切り捨て)」になるというルールがあります。
a / b(つまり 5 / 2)の計算結果は、2.5ではなく 2 となります。

その 2 を後から double 型の変数 result に代入しているため、結果は 2.000000 となってしまうのです。

これを防ぐには、計算式のどちらか(あるいは両方)を小数型にする必要があります。

(double)a のようにキャスト(型変換)を行うか、定数なら 5.0 のように記述することで、正しく 2.5 という結果が得られます。

型と指定子の不一致に注意

int 型の変数を %f で表示しようとしたり、逆に double 型を %d で表示しようとすると、全くデタラメな数字が表示されたり、0.000000 と表示されたりします。

printf の指定子は、必ず変数の型と一致させるように注意しましょう。

余分な0を表示しない方法 (%g の活用)

%f を使うと 1.500000 のように末尾に0が付きますが、「1.5 なら 1.52 なら 2 とスッキリ表示したい」という場合もあります。

そんな時に便利なのが %g 指定子です。

%g 指定子でスッキリ表示する

%g(または %lg)は、値の大きさに応じて %f(通常表記)と %e(指数表記)を自動で切り替え、さらに末尾の不要な0を削除してくれます。

#include <stdio.h>

int main(void) {
    double num1 = 10.5000;
    double num2 = 100.0;
    double num3 = 0.000123;

    printf("num1: %g\n", num1);
    printf("num2: %g\n", num2);
    printf("num3: %g\n", num3);

    return 0;
}

実行結果

num1: 10.5
num2: 100
num3: 0.000123

10.500010.5 に、100.0100 に整形されました。
桁数を厳密に揃える必要がなく、人間が見やすい形式で出力したい場合は %g が非常に便利です。

ただし、デフォルトの有効桁数は6桁であるため、これを超える精度が必要な場合は %.10g のように指定する必要があります。

また、非常に大きい数や小さい数は 1.23e+05 のような指数表記になります。

表示だけでなく数値を操作したい場合(切り捨て・四捨五入)

printf("%.0f", val) は表示上丸め処理を行いますが、計算結果そのものを整数に丸めたい場合は、数学関数を使用します。

math.h を使った計算

#include <stdio.h>
#include <math.h> // 数学関数を使うために必要

int main(void) {
    double val = 3.7;
    double neg = -2.5;

    // 切り捨て (floor)
    printf("切り捨て: %.1f\n", floor(val));

    // 切り上げ (ceil)
    printf("切り上げ: %.1f\n", ceil(val));

    // 四捨五入 (round) C99以降
    // 0から遠い方向へ丸めます(2.5 -> 3.0, -2.5 -> -3.0)
    printf("四捨五入: %.1f\n", round(val));
    printf("負の四捨五入: %.1f\n", round(neg));

    // int型へのキャストによる切り捨て(0方向への切り捨て)
    int i_val = (int)val;
    printf("キャスト: %d\n", i_val);

    return 0;
}

実行結果

切り捨て: 3.0
切り上げ: 4.0
四捨五入: 4.0
負の四捨五入: -3.0
キャスト: 3

計算値として丸め処理を行いたい場合は、<math.h> をインクルードして floor(床関数)、ceil(天井関数)、round(四捨五入)を使用します。

また、単に小数部分を切り捨てて整数にしたいだけであれば、(int) でキャストするのが最も高速で簡単です。

C言語のスキルを活かして年収を上げる方法

以上、C言語で小数を表示する方法について解説してきました。

なお、C言語のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

C言語を扱えるエンジニアは比較的希少価値が高く、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC言語の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。