アプリ版:「スタンプのみでお礼する」機能のリリースについて

ご存知の方教えていただけますか?
以下のコードで実行するとansが0.5ではなく0になってしまうのですが
なぜでしょうか?

int a = 64; // a=1,b=2でも0になってしまいます。
int b = 128;
float ans;
ans = a/b;
printf("ans = %f",ans)

仕様ですか?
大変申し訳ありません。よろしくお願いします。

A 回答 (2件)

一言で言えば、仕様です。


ふたつの側面がありますが。

まずひとつ。Cでは、int 型通しの演算の結果は、int です。
ですから、 a / b の計算結果は、int になります。

次、
ans = a / b ;
は、一見、ans が float なので、float 型の結果が得られそうですが、右辺が int なので、float = int という代入が発生しているに過ぎません。
このため、
a / b の結果が(int として) 0
ans = 0;
という代入が行われて、ans の結果はゼロになります。

これを防ぐためには、a か b のいずれかを float にしてやればいいわけで、
ans = (float)a / b;
ans = a / (float)b;
のいずれも答えは、0.5 になります。

これは、int と float の演算は、「int の方を float に変換した上で計算して、結果は float」という決まりだからです。

ans = (float)a / (float)b;
でも同じですね。

ただ、
ans = (float)(a / b);
では結果はやはりゼロになります。
というか、この場合は、 ans = a / b; と同じことです。

あと、普通の場合、float を使うよりは、double を使った方が良いと思います。
    • good
    • 0
この回答へのお礼

>一見、ans が float なので、float 型の結果が得られそうですが、右辺が int なので、float = int という代入が発生しているに過ぎません

よく理解できました。
ありがとうございます。

>ans が float なので、float 型の結果が得られそうですが
そうなると思っていました。

お礼日時:2007/06/18 20:12

> 仕様ですか?



仕様です。

小学校低学年で習ったことを思い出してみましょう。
64 ÷ 128 = 0 ... 64
ですね。
int型は整数型ですので、演算結果も整数しか扱えません。整数を浮動小数点型の変数(今回であればans)に代入したとしても、元々持っていない情報が補完されるわけではありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!