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
Non funziona anche il '2/3.0'? –
Sì. O '2.0/3'. Le promozioni di tipo vanno verso i formati in virgola mobile. – Tommy