C言語で数値計算を行う際、避けて通れないのが「小数(浮動小数点数)」の扱いです。
単に数値を表示するだけでも、
「計算したはずなのに 0.000000 と表示されてしまう」
「末尾の余分な0を消したい」
・・・など、多くの疑問やトラブルに直面することがあります。
この記事では、C言語における小数の基本的な表示方法から、printf 関数のフォーマット指定子を使った桁数制御、そして初心者が陥りやすい計算ミスの原因と対策まで、年現在の開発環境に合わせて徹底解説します。
![]() 執筆者:マヒロ |
|
小数を表示する基本:printfと変換指定子
C言語で変数の値を画面に表示するには、標準ライブラリの printf 関数を使用します。
このとき、整数の場合は %d を使いますが、小数の場合は変数の型(float や double)に合わせた「変換指定子」の理解が重要です。
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 の中身自体が書き換わったわけではないという点です。
全体の幅と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 / 2 は 2.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.5、2 なら 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.5000 は 10.5 に、100.0 は 100 に整形されました。
桁数を厳密に揃える必要がなく、人間が見やすい形式で出力したい場合は %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言語の案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



