質問

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

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

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

これも0に等しくなります。

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

これは250,000に相当します。これはまっすぐ左から右の数学です。

int o = 60 / i * 50 * 1000;

ここで私の頭の上に何が飛んでいますか?

ありがとう、
ニック

役に立ちましたか?

解決

Objective-Cで / 整数引数で整数分割を実行するため、4/5は0、3/2に切り捨てられ、1に切り捨てられます。おそらく、部門を実行する前に、いくつかの数字を浮かぶポイントフォームにキャストしたいと思うでしょう。

また、優先順位のある問題にも駆け抜けています。式で

60 / (i * 50) * 1000

括弧内の内部の用語は最初に計算されるため、60は600で除算され、結果0が生成されます。

60 / i * 50 * 1000

最初の操作は、60を12で除算することです。これにより、結果5が得られ、乗算が実行されます。

他のヒント

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

それで 60/600 ではありません 0.1, 、そうです 0.

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

交換:

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

と:

int o = 1200/i;

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

浮動小数点を強制してから整数に戻ってキャストする場合に機能する必要があります。

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

おそらくすべてをダブルにするために本当に必要ではありません。

優先順位で、操作:

60 / (12 * 50) 

乗算する前に実行されます 1000.

この値は1未満で、にキャストされます int, 、それを切り捨てます 0. 。と 0 何でもあります 0.

使う float または最初に掛けます 1000 あなたが伝播することに終わらないことを確認するため 0 あなたの計算で。

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

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

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

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

intの代わりにここでフロートを使用する必要があると思います。それはあなたが望むように機能します!小数でも回答します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top