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

dovrebbe restituire 1. Tuttavia, esso mostra:Objective C Ceil restituisce valore errato

CEIL 0.000000 

Perché e come risolvere questo problema? Io uso ceil([myNSArray count]/3) e restituisce 0 quando il numero di array è 2.

risposta

51

Le stesse regole si applicano C: 2 e 3 sono interi, così 2/3 è una divisione intera. La divisione intera tronca in modo che 2/3 produca il numero intero 0. Il numero intero 0 verrà quindi convertito in un float di precisione doppia per la chiamata a ceil, ma ceil(0) è 0.

Modifica del codice a:

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

visualizzerà il risultato vi aspettate. L'aggiunta del punto decimale fa sì che le costanti vengano riconosciute come numeri in virgola mobile a precisione doppia (e 2.0f è come si digiterà un singolo numero in virgola mobile di precisione).

soluzione Maudicus' funziona perché (float)2/3 proietta l'intero 2 ad un galleggiante e le regole di promozione di C significa che esso sarà promuovere il denominatore a virgola mobile al fine di dividere un numero in virgola mobile da un numero intero, dando un risultato in virgola mobile.

Quindi, la sua dichiarazione corrente ceil([myNSArray count]/3) dovrebbe essere cambiata a uno:

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

Oppure:

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

Non funziona anche il '2/3.0'? –

+0

Sì. O '2.0/3'. Le promozioni di tipo vanno verso i formati in virgola mobile. – Tommy

10

2/3 viene valutato su 0 a meno che non lo si lanci su un valore float. Quindi, devi stare attento con i tuoi valori trasformati in int prima di volere.

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

==>

CEIL 1.000000 

Ad esempio si matrice

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

Probabilmente valuta 2 e 3 come interi (come sono, ovviamente), una valutazione sulla risultato (che è 0), quindi lo converte in float o double (che è anche 0.00000). Il modo più semplice per risolverlo è digitare 2.0f/3, 2/3.0f, o 2.0f/3.0f, (o senza "f" se lo desideri, qualunque cosa ti piaccia di più;)).

Spero che sia utile

Problemi correlati