int同士の割り算で小数点以下が切り捨てられる
int型同士を/で割ると、結果もint型になり小数点以下が切り捨てられます。平均値の計算などで意図せず結果が狂う典型的な原因です。
なぜエラーが出ないのか
出力: 3.0
(エラーなし)- Cは何も報告しません。コンパイルも実行も正常に完了するためです
出力: 3.0- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 int main(void) { 4 int total = 7; 5 int count = 2; 6 double avg = total / count; ^ 7 printf("%.1f\n", avg); 8 return 0; 9 }
出力: 3.0期待: 3.5
int同士の割り算は小数点以下を切り捨てたint型の結果になります。その結果をdoubleに代入しても、切り捨てはもう元に戻りません。片方をdoubleにキャストしてから割る必要があります。
直し方: / を / 1.0 / にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 3 int main(void) { 4 int minutes = 100; 5 double hours = minutes / 60; ^ 6 printf("%.2f\n", hours); 7 return 0; 8 }
出力: 1.00期待: 1.67
minutesも60もint型なので、/は整数除算になり小数点以下が切り捨てられます。結果をdouble型の変数に代入しても、切り捨てられた後の値がそのまま入るだけです。
直し方: / を / 1.0 / にします。
パターン3
1 #include <stdio.h> 2 3 int main(void) { 4 int price = 999; 5 int people = 4; 6 double share = price / people; ^ 7 printf("%.2f\n", share); 8 return 0; 9 }
出力: 249.00期待: 249.75
999 / 4は整数除算として計算され249になり、そのあとでdoubleに変換されます。先にdoubleへ変換してから割らない限り、小数部分は復元できません。
直し方: / を / 1.0 / にします。
よくある誤解
他の言語の経験から「割り算の結果は自動でdoubleになる」と思いがちですが、Cの/は両辺の型で結果の型が決まります。int同士なら結果もintです。小数を得たい場合は、割る前にどちらかをdoubleにキャストする必要があります。
まとめ
int同士の割り算で小数点以下が切り捨てられるは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。