2010-12-30 24 views
5

Estoy creando una paginación y me sale un problema.C#: Pagination, Math.Ceiling

Si tengo un número 12 y quiero dividirlo por 5 (5 es el número de resultados que quiero en una página), ¿cómo lo redondearía correctamente? Esto no funciona:

int total = 12; 
int pages = Math.Ceiling(12/5); 
//pages = 2.4... but I need it to be 3 
+1

¿Cómo se obtienen las páginas a 2,4 ???? Un 'int' no tiene decimales. –

+0

páginas no es realmente 2.4 ... esa ecuacion sería 2.4. Ese es el punto ... – dcolumbus

+0

Ok, entonces tu problema es probablemente que no lo estás transfiriendo a un int y manejar el hecho de que int arithmetics siempre regresa en int. Se mi respuesta en 2 segundos –

Respuesta

13

A pesar de que el código debe trabajar, Math.Round está mal sin embargo, usted podría intentar esto:

int pages = (total + pageSize - 1)/pageSize; 

Eso debería ser lo mismo que Math.Ceiling, excepto que siempre se trata de int y no de double en cualquier punto como Math.Ceiling regresa.

EDIT: para obtener su código funcione usted podría intentar:

int pages = (int)Math.Ceiling((double)12/(double)5); 

pero debería utilizar el primer ejemplo.

+1

No vea el uso de su edición. ¿La primera línea de código ya proporciona la respuesta correcta (3)? – comecme

+0

Su ejemplo usando 'Math.Ceiling' no se compilará realmente. 'Math.Ceiling' tiene sobrecargas para' decimal' y 'double'. Usarlo con un 'int' le dará un error de llamada ambiguo. –

+0

@Phil: ¿Estás seguro de eso? ¿No hay una conversión implícita de int a double? Pero lo actualicé para ser más de lo que estaba haciendo. –

6

que podría hacer:

int numPages = Math.Ceiling((decimal)12/(decimal)5); 

o

int numPages = (12 + 4)/5; //(total + (perPage - 1))/perPage 
+0

Así que aunque 12 y 5 no son decimales, tengo para lanzarlos como tal? – dcolumbus

+0

Si no lo haces, harás un número entero de 12 por 5 que resultará en 2. Después de eso, intentarás hacer Matemáticas. Cebar en 2 brujas seguirá siendo 2. La división va antes de las Matemáticas. Techo. Si divides 12.0 por 5.0 obtendrás 2.4, por lo que Math.Ceiling se convertirá en 3. Sin embargo, la segunda opción es mejor, como explicó Tomas Jansson. – comecme

+0

@dcolumbus - sí. int/int en C# siempre devuelve e int. Por lo tanto, debe lanzarlos si quiere decimales para que el techo/redondeo funcione como espera. – Chad

Cuestiones relacionadas