2011-11-17 75 views
17
NSLog(@"CEIL %f",ceil(2/3)); 

應該返回1。然而,它表明:目標C小區返回錯誤值

CEIL 0.000000 

爲什麼,以及如何解決這個問題?我使用ceil([myNSArray count]/3),並且在陣列數爲2時返回0.

回答

51

同樣的規則爲C適用:23是整數,所以2/3是整數除法。整數除法截斷所以2/3產生整數0。該整數0將被轉換爲雙精度浮點數,用於撥打ceil,但ceil(0)0

的代碼更改爲:

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

會顯示您預期的結果。添加小數點會導致常量被識別爲雙精度浮點數(並且2.0f是您輸入單精度浮點數的方式)。

Maudicus'解決方案的工作,因爲(float)2/3鑄整數2的浮動和C的促銷規則意味着它會促進分母浮點爲了用一個整數除以一個浮點數,給人一種浮點結果。

所以,你當前語句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的計算結果爲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的整數(因爲它們是,很明顯),評估結果(它是0),然後將其轉換爲float或double(也是0.00000)。修復它的最簡單的方法是輸入2.0f/3,2/3.0f或2.0f/3.0f,(或者如果你願意,不需要「f」,無論你喜歡什麼);)。

希望它有幫助