2011-02-07 19 views
66

Tengo 2 int. ¿Cómo puedo dividir uno por el otro y luego reunirlo después?Dividir int y redondear en Objective-C

+12

Es una pregunta muy básica, pero es legítimo; la división de enteros no siempre se comporta como se esperaría. –

+3

Sé que suena bastante escaso pero tengo problemas con los diferentes tipos de datos de Object-C, echado a perder por el casting automático que puedes hacer en .net – Slee

Respuesta

196

Si sus puntos son A y B y quiere tener límite (A/B) simplemente calcule (A+B-1)/B.

+2

La mejor respuesta: si me quedaran votos hoy, me quedaría '+ 1'. –

+1

Lo he visto hecho de esta manera muchas veces. Es un buen patrón para recordar. – Ferruccio

+0

Esto es perfecto. – Jack

4
-(NSInteger)divideAndRoundUp:(NSInteger)a with:(NSInteger)b 
{ 
    if(a % b != 0) 
    { 
    return a/b + 1; 
    } 
    return a/b; 
} 
+1

ya que los bools aún son 0/1 en este idioma, solo puede tener: 'return a/b + (a% b! = 0)' – iisystems

+0

Tenga en cuenta que aunque este caso es correcto, BOOLs no son necesariamente 1 y 0 . Son "0" y "no 0" –

+0

@ La solución de Howard puede ser más eficiente y matemáticamente más simple, pero me gusta más esta solución. La intención y la metodología son más claras para los programadores estadounidenses que piensan en términos de condiciones y cálculos de ramificación, no en la equivalencia algebraica. ;-) –

3

Como en C, puede lanzar tanto para flotar como para redondear el resultado utilizando una función de redondeo que toma un flotador como entrada.

int a = 1; 
int b = 2; 

float result = (float)a/(float)b; 

int rounded = (int)(result+0.5f); 
i 
+2

No hay necesidad de lanzar para flotar - hay soluciones enteras solo más simples y más sencillas - vea la respuesta de @ Howard por ejemplo –

+0

Buen punto - Me perdí la parte de "redondear". Howard's es una solución muy elegante +1 –

34

¿Qué hay de:

float A,B; // this variables have to be floats! 
int result = floor(A/B); // rounded down 
int result = ceil(A/B); // rounded up 
+1

¿No funciona para dos entradas, seguramente? Porque la división devolverá un resultado int. Pero para dos carrozas, convirtiendo a int (que es lo que necesitaba en este momento), esto es correcto. – Adam

+0

sí, eso es cierto. Edité mi respuesta para que quede más claro – kraag22

0

Si busca 2.1 Roundup> 3

double row = _datas.count/3; 
double rounded = ceil(_datas.count/3); 
if(row > rounded){ 
    row += 1; 
}else{ 

} 
Cuestiones relacionadas