lisz-works

技術系だけど関係ないこと多い系ブログ

「1/2=0」となる。リテラル値での計算結果が小数値を想定する場合の注意点

【スポンサーリンク】

プログラムのソースコード

C/C++で、リテラル値での計算を行い、結果が小数点数となる計算を行う際の書き方についてです。

リテラル値とは?

端的にいうと、コード上に直で書いた値のことです。

下の例でいう「5」のことです。

int a = 5;

失敗例

「1 / 2」をして、結果「0.5」を変数に格納したい。としましょう。

そのまま「1 / 2」を試すと、結果「0」となってしまいます。

double ret = 0.0;

ret = 1 / 2;                    // NG: ret = 0

改善例

どうすれば期待していた「0.5」にできたのでしょうか。
例のうち、どちらかに変更しましょう!

double ret = 0.0;

ret = 1.0 / 2.0;                // OK: ret = 0.5
ret = (double)1 / (double)2;    // OK: ret = 0.5

そんな難しい話ではないですね。

「1.0 / 2.0」のように、小数点「.0」までつけるのが手っ取り早いですよ。

なんでこうなるの?

リテラル値は、「1」のように書くと整数値として扱われます。
しかし「1.0」のように書くと、見ての通り小数点数として扱われます。

失敗例……「1」のように書いた場合、「int / int」となり

成功例……「1.0」のように書いた場合は「double / double」となります。

あとがき

一見単純なことですが、0.5となるはずが、0となってしまっては処理が大きく変わってしまいます。

昔これのせいで、どうもうまくいかず、デバッグ中にゾッとしました……

気を付けていきましょうー。