11

iPhone アプリケーションでいくつかの数値を計算しようとしています。

int i = 12;
int o = (60 / (i * 50)) * 1000;

この例では、o は 100 (ミリ秒) であると予想されますが、NSLog(@"%d", o) で表示されるように 0 に等しくなります。

これも 0 です。

int o = 60 / (i * 50) * 1000;

これは 250,000 に等しく、左から右への単純な計算です。

int o = 60 / i * 50 * 1000;

ここで私の頭の上を飛んでいるのは何ですか?

ありがとう、
ニック

4

7 に答える 7

20

Objective-C/では、整数引数に対して整数除算が実行されるため、4/5 は 0 に切り捨てられ、3/2 は 1 に切り捨てられます。除算を実行する前に、数値の一部を浮動小数点形式にキャストしたい場合があります。

また、優先順位の問題にも直面しています。式では

60 / (i * 50) * 1000

かっこ内の項が最初に計算されるため、60 を 600 で割り、結果は 0 になります。

60 / i * 50 * 1000

最初の演算は 60 を 12 で除算することであり、結果は 5 になり、次に乗算が実行されます。

于 2010-11-16T18:57:41.567 に答える
4

整数で割った整数は整数です。

そうで60/600はありません。0.10

代わりにいくつかのものをキャスト (または宣言) しfloatます。

于 2010-11-16T18:57:59.123 に答える
1

整数演算を行っています。60 /(12 * 50)は0.1で、0に切り捨てられます。

浮動小数点を強制してから整数にキャストバックすると機能するはずです。

int o = (int)(60.0 / ((double) i / 50.0) * 1000.0;

おそらく、すべてを2倍にする必要はありません。

于 2010-11-16T18:58:40.713 に答える
1

交換:

int o = (60 / (i * 50)) * 1000;

と:

int o = 1200/i;
于 2010-11-16T19:05:02.033 に答える
0

優先順位により、操作は次のようになります。

60 / (12 * 50) 

を掛ける前に実行され1000ます。

この値は1未満であり、にキャストされます。これによりint、値がに切り捨てられ0ます。そして0何回もです0

floatまたは最初の乗算を使用して、計算で1000aが伝播されないように0します。

于 2010-11-16T18:59:43.040 に答える
0

式のすべての演算は整数演算で実行されます。つまり、各中間結果の小数部分が切り捨てられます。これは、小さい整数を大きい整数で割ると、常に0になることを意味します。

必要な結果を得るには、操作が特定の順序で実行されていることを確認するか、floatを使用する必要があります。たとえば、

int o = (60.0 / (i * 50.0)) * 1000.0;

o=100である必要があります。

于 2010-11-16T19:01:45.540 に答える
0

ここでは int の代わりに float を使用する必要があると思います。それはあなたが望むように動作します!小数でも答えてくれます。

于 2012-04-03T20:55:31.627 に答える