2008-10-30 17 views
8

Tengo un menú de marcas de productos que quiero dividir en 4 columnas. Entonces, si tengo 39 marcas, quiero que el recuento máximo de artículos para cada columna sea 10 (con un espacio en la última columna. Así es como estoy calculando el recuento de artículos para una columna (usando C#):Matemáticas enteras en C#

int ItemCount = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(BrandCount)/4m)); 

Todo lo que la conversión parece muy feo para mí ¿hay una mejor manera de hacer matemáticas con enteros en C#

Respuesta

21

puede fundido:.?.

int ItemCount = (int) Math.Ceiling((decimal)BrandCount/4m); 

Además, debido a int/decimal da como resultado una decimal se puede quitar uno de los elencos:

int ItemCount = (int) Math.Ceiling(BrandCount/4m); 
+0

Esto era lo que estaba a punto de escribir. +1. – OregonGhost

+0

Es lo que terminé escribiendo. :) +1 también. –

+0

Guau, eso es mucho más limpio. Gracias. –

7

una alternativa más tiempo con Mod

ItemCount = BrandCount/4; 
if (BrandCount%4 > 0) ItemCount++; 
+2

más tiempo? Mas simple! +1 – Treb

2

Tal vez intentar algo como esto ... Suponiendo BrandCount es un entero. Todavía tiene los mismos moldes, pero podría ser más claro:

int ItemCount = (int)(Math.Ceiling(BrandCount/4m)); 

No soy un gran fan de la clase Convert, y lo evito siempre que sea posible. Siempre parece hacer que mi código sea ilegible.

+0

Estoy totalmente de acuerdo contigo -> Convert.ToInt32 (foo) es feo en comparación con (int) foo. –

+0

¿El reparto hace exactamente lo mismo que Convert? –

+1

@Ben Mills: en este caso, sí (conversión de números). En general, no. – OregonGhost

10

¿Por qué incluso está usando un decimal?

int ItemCount = (BrandCount+3)/4; 

El +3 se asegura de que redondear hacia abajo en lugar de:

(37+3)/4 == 40/4 == 10 
(38+3)/4 == 41/4 == 10 
(39+3)/4 == 42/4 == 10 
(40+3)/4 == 43/4 == 10 

En general:

public uint DivUp(uint num, uint denom) 
{ 
    return (num + denom - 1)/denom; 
} 
+2

Me gusta el truco, pero creo que es más difícil ver el propósito del código. La respuesta que acepté es fácil de volver y mantener. –

+0

¿Llamas a * esto * un truco? No te envidio tratando de mantener cualquiera, pero el más trivial de los programas ... – Motti

+6

en serio - ceil (a/b) = ((a + b-1)/b) es un "truco" que los programadores han estado utilizando para años antes de C#. – cce

Cuestiones relacionadas