NSLog(@"CEIL %f",ceil(2/3));
を返し、それが示していますのObjective Cの切り上げが間違った値に
CEIL 0.000000
なぜ、どのようにその問題を解決するには? ceil([myNSArray count]/3)
を使用し、配列数が2のときに0を返します。
NSLog(@"CEIL %f",ceil(2/3));
を返し、それが示していますのObjective Cの切り上げが間違った値に
CEIL 0.000000
なぜ、どのようにその問題を解決するには? ceil([myNSArray count]/3)
を使用し、配列数が2のときに0を返します。
Cと同じ規則が適用されます。2
と3
は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
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));
それはおそらく整数として2と3を評価する(彼らは明らかに、あるとして)、評価result(これは0)を返し、floatまたはdoubleに変換します(これも0.00000です)。これを修正するもっとも簡単な方法は、2.0f/3,2/3.0f、2.0f/3.0fのいずれかを入力することです(必要な場合は「f」を付けずに、もっと好きなものを入力してください))。
希望します。
「2/3.0」も機能しませんか? –
はい。あるいは '2.0/3'。タイププロモーションは浮動小数点フォーマットに向かって実行されます。 – Tommy