float の値に小数が含まれているかの判定のお話です。一瞬、どうやるんだっけと思ってしまうこの判定方法ですが、分かってしまえばなあるほどと納得。ですが、突き詰めていったら、いろんな実装方法が見つかって…。


  • キャストする
キャストすると、実数は強制的に整数に置き換えられます。つまり小数が捨てられます。その整数化した値が、元の実数の値と同じかどうかで小数部があるかどうかを判定します。例えばこんな感じです。

float check = 3.14F; if ((float)(int)check == check) { // 小数部は存在しない } else { // 小数部が存在する }

ただ、見た目が気持ち悪いですけどね…。


  • 小数を切り捨てる
C言語には小数切り捨て関数が用意されているので、それを使って切り捨ててから元の値と比較するという方法も採れます。

float check = 3.14F; if (floor(check) == check) { // 小数部は存在しない } else { // 小数部が存在する }

小数切り捨ての floor 関数を使用する場合は #include <math.h> を指定します。
※ 小物がたくさんある場合は、ラゲッジルームにこんなケースを入れておくとまとまりが良いです。

  • 割った余り
それではと、今度は割った余りで判定する方法を考えてみました。これは 1 で割った余りが 0 なら小数部はないと判断する方法です。例えば…

float check = 3.14F; if (fmodf(check, 1) == 0) { // 小数部は存在しない } else { // 小数部が存在する }
ちなみに C# だと % を実数にも使えるのでこんな書き方が出来ます。C言語でも出来ると良かったんですけど、残念ながら普通の C言語(?)だとエラーになるようです。

float check = 3.14F; if (check % 1 == 0) { // 小数部は存在しない } else { // 小数部が存在する }
※ タクシーみたい?足腰弱い人が後部座席に乗るならこれがあるとラクなんです。