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

deberían volver 1. Sin embargo, se nota:ceil C devuelve un valor incorrecto

CEIL 0.000000 

¿Por qué y cómo solucionar ese problema? Yo uso ceil([myNSArray count]/3) y devuelve 0 cuando el recuento de la matriz es 2.

Respuesta

51

Las mismas reglas que se aplican C: 2 y 3 son enteros, por lo 2/3 es una división entera. La división entera trunca para que 2/3 produzca el número entero 0. Ese entero 0 se convertirá en un flotador de doble precisión para la llamada a ceil, pero ceil(0) es 0.

Cambiar el código para:

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

mostrará el resultado que esperas. Agregar el punto decimal hace que las constantes se reconozcan como números de punto flotante de precisión doble (y 2.0f es cómo debe escribir un número de coma flotante de precisión única).

solución Maudicus' funciona porque (float)2/3 arroja el entero 2 a un flotador y reglas de la promoción de C significa que va a promover el denominador a punto flotante con el fin de dividir un número de coma flotante por un entero, dando un resultado de coma flotante.

lo tanto, su estado de cuenta actual ceil([myNSArray count]/3) se debe cambiar a cualquiera:

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

O:

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

Does not '2/3.0' trabajo también? –

+0

Sí. O '2.0/3'. Las promociones tipo se ejecutan en formatos de punto flotante. – Tommy

10

2/3 se evalúa a 0 a menos que lo lances a una flotación. Por lo tanto, debe tener cuidado con sus valores convertidos a int antes de que desee.

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

==>

CEIL 1.000000 

Para usted ejemplo array

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

Probablemente evalúa 2 y 3 como enteros (como son, obviamente), evalúa la resultado (que es 0), y luego lo convierte en flotante o doble (que también es 0.00000). La forma más fácil de solucionarlo es escribir ya sea 2.0f/3, 2/3.0f o 2.0f/3.0f, (o sin "f" si lo desea, lo que más le guste;)).

creo que sirve

Cuestiones relacionadas