18

本当に奇妙なことが起こっています。

float p1 = (6 / 100);
NSLog(@"p1 = %f", p1);

この 2 行のコードを使用すると、次の出力が得られます。

p1 = 0.000000

静的な数値を持つ単純なデバイスが機能しないのはなぜですか! 分割が機能しないことに対処するために、やるべきことがたくさんあります。彼は一体、私は狂っているのですか?

4

4 に答える 4

35

これらの定数は整数であるため、計算は整数演算で行われます。試す

float p1 = (6.0 / 100.0);

編集float— @Stephen Canon は、「p1」がであるため、計算全体を次のように実行しない理由はないことを賢明に指摘していfloatます。

float p1 = (6.0f / 100.0f);

さて、これらは両方とも定数であるため、とにかくコンパイラによって作業が行われる可能性が非常に高いと思います。一部の最新のマシン (つまり、Intel アーキテクチャ) では、浮動小数点プロセッサの命令セットが非常に奇妙であり、明らかな「最適化」のように見えるものが、そのように機能する場合と機能しない場合があることも事実です。最後に、定数を使用して操作を実行すると、 (場合によっては)値を使用して操作を実行してから にキャストするという別の結果が得られる可能性があると思います。他の。floatdoublefloat

于 2010-09-13T16:48:48.053 に答える
12

これらの数値は両方ともコンピューターによって整数と見なされるため、整数演算が実行され、小数点なしの整数が返されます。これは 0 (0.06) であり、浮動小数点数に変換されて変数 p1 に格納されます。

浮動小数点演算を行うには、少なくとも 1 つの数値 (または両方) が浮動小数点数である必要があります。数値に小数を追加すると、定数が浮動小数点数であることをコンピューターに伝えます。

float p1 = (6.0 / 100);

または、それを型キャストすることもできます

float p1 = ((float)6 / 100);
于 2010-09-13T16:59:37.443 に答える
9

割り当てには整数除算が含まれており、除算する数値が大きい場合はゼロを返します。あなたはおそらく次のことをするつもりでした:

float p1 = (6.0f / 100.0f);
于 2010-09-13T16:50:40.510 に答える
1

2 つの int 変数を除算して float の結果を取得するための回避策。

int x = 5;
int y = 7;

float z = x / y;  // always 0

修正

float z = 1.0 * x / y;

注:順序を変更すると、このソリューションは機能しません。

編集: この回答の前の回答によると、これを使用できます

float z = (float) x / y;
于 2015-06-25T07:35:21.857 に答える