2011-11-17 17 views

答えて

51

Cと同じ規則が適用されます。23はint型であるので、2/3は整数除算です。整数部は切り捨てられ、は整数0を生成します。その整数0は、ceilへの呼び出しのために倍精度浮動小数点にキャストされますが、ceil(0)0です。あなたが期待している結果が表示されます

NSLog(@"CEIL %f",ceil(2.0/3.0)); 

にコードを変更します。小数点を追加すると、定数は倍精度浮動小数点数として認識されます(2.0fは単精度浮動小数点数の入力方法です)。 (float)2/3フロートの整数2をキャストし、Cのプロモーションルールは、それが浮動小数点の結果を与え、整数、浮動小数点数を分割するために、浮動小数点への分母を促進しますことを意味するので

Maudicusのソリューションが動作します。

だから、あなたの現在の文ceil([myNSArray count]/3)がどちらかに変更する必要があります。

([myNSArray count] + 2)/3   // no floating point involved 

または:

ceil((float)[myNSArray count]/3) // arguably more explicit 
+1

「2/3.0」も機能しませんか? –

+0

はい。あるいは '2.0/3'。タイププロモーションは浮動小数点フォーマットに向かって実行されます。 – Tommy

10

2/3は、floatにキャストしない限り、0と評価されます。 したがって、値をintに変換してから、必要になる前に注意する必要があります。

float decValue = (float) 2/3; 
NSLog(@"CEIL %f",ceil(decValue)); 

==>

CEIL 1.000000 

あなたの配列の例は

float decValue = (float) [myNSArray count]/3; 
NSLog(@"CEIL %f",ceil(decValue)); 
1

それはおそらく整数として2と3を評価する(彼らは明らかに、あるとして)、評価result(これは0)を返し、floatまたはdoubleに変換します(これも0.00000です)。これを修正するもっとも簡単な方法は、2.0f/3,2/3.0f、2.0f/3.0fのいずれかを入力することです(必要な場合は「f」を付けずに、もっと好きなものを入力してください))。

希望します。

関連する問題