2010-04-08 13 views
22

Perdón por favor mi conocimiento de programación. Sé que esto es algo simple, pero no entiendo por qué el resultado es siempre 0. ¿Por qué el decimal estará bien?Por qué no puedo obtener el porcentaje usando Int

int a = 100; 
int b = 200; 
decimal c = (a/b) * 100; 

Muchas gracias.

+3

c = (a * 100)/b; – kenny

+3

Eso no funcionará. a * 100/b aún trunca el decimal y luego lo convierte a tipo decimal. Terminas sin mantisa. – Armstrongest

+1

c = (a * 100M)/b; Además, consulte http://mathworld.wolfram.com/IntegerDivision.html – Greg

Respuesta

54

La división entera siempre trunca el resto. Esto se hace en el momento en que se divide el número, no cuando se asigna a la variable (como supongo que asumió).

decimal c = ((decimal)a/b) * 100; 
+0

El truncado también se conoce como la operación matemática de piso. –

+0

+1 por el cambio mínimo para corregir la respuesta. –

+4

@ rlb.usa: Si se trata de un piso adecuado depende de cómo maneja los negativos. Off-hand, creo que cambia -1.2 a -1, no -2, sin embargo. –

13

El valor a/b devolverá 0 siempre, ya que son enteros. Así que cuando se evalúan los valores dentro de los corchetes que está haciendo técnicamente esto

decimal c = (0) * 100 

mejor que hagas,

decimal c = ((decimal)a/(decimal)b) * 100 
+0

-1 para obtener respuestas confusas y engañosas. 'int/int = int', que pareces conocer pero no explicaste. – ANeves

+2

"a/b devolverá 0 siempre" a menos que se den valores diferentes para 'a' y' b', en cuyo caso será 'a/b'. –

9

100/200 es 1/2 o 0.5. Como está usando enter, redondea a 0 (cero). Y 0 * 100 sigue siendo 0. La parte interior de los paréntesis siempre se evalúa en primer lugar: si se quiere conseguir este trabajo, utilice:

decimal c = (a * 100)/b; 

Editar: si quieres un valor más preciso en lugar de un "porcentaje entero "(es decir, 33.333% en vez de 33%), debe usar la respuesta de Bragaadeesh.

+0

Como le dije a Stu Mackellar, esto no funciona porque trunca. –

+2

Si reescribió eso como '(a * 100M)/b', obtendría el resultado que desea. –

+0

@Steven, como te dije en su respuesta, eso puede ser lo que Daoming quiere. Es cómo interpreté su pedido, dado que está comenzando con enteros y quiere un porcentaje. @Anthony igualmente, yo * quiero * una respuesta entera. – tloflin

0

hacerla decimal c = (a * 100)/b;

+0

No creo que esto funcione como te imaginas. Redondeará. Por ejemplo, si a = 1 yb = 3, queremos que c sea 33.333 (hasta tantos 3 como podamos). Con su código, tendríamos 33.0 –

+0

Verdadero. El OP no mencionó que quería un número real, pero supongo que está implícito en el decimal. –

+4

Si reescribió eso como '(a * 100M)/b', obtendría el resultado que desea. –

2

Operaciones aritméticas con enteros se está realizando, y el resultado es luego se almacena como un decimal. 100/200 en matemáticas enteras es 0. Para obtener su porcentaje, coloque al menos un valor en decimal antes de hacer el cálculo.

decimal c = (a/(decimal)b) * 100; 
0

int sólo puede ser números enteros, por lo 100/200 va a ser 0. 0 * 100 sigue siendo 0. Cambie el tipo a un decimal, y funcionará

1

La matemática está haciendo todavía es un número entero de matemáticas.

(a/b) (100/200 o 1/2) se realiza en dos enteros, por lo que el resultado es cero. Zero * 100 es ... bueno, sigue siendo cero.

El problema que está experimentando es con el orden de las operaciones (a y b son números enteros, por lo que se realizan cálculos enteros).

que sugieren esto:

decimal c=((decimal)a)/((decimal)b)*100;

Esto obligará a los cálculos realizados con los valores decimales que usted busca.

+0

Use 100.0M en lugar de 100 para evitar el costo del lanzamiento implícito. –

+0

Pero luego asegúrese de usar 100.0M en la primera operación. (Consulte otras respuestas para obtener más información.) – ANeves

0

Al usar números enteros, este '/' significa DIV y este '%' para MOD. DIV es el cociente de la división, MOD es el resto. Así, 100/200 = 0 y el 100% 200 = 100.

Así, es necesario cambiar a y b tipos de decimal, en su caso.

1

En los lenguajes fuertemente tipados, el resultado de las operaciones matemáticas suele ser del mismo tipo que el tipo más grande.

C# tiene una lista de implicit numeric conversions que hará.

Generalizando esta lista: los tipos integrales se pueden convertir a tipos de coma flotante, pero no al revés. Los tipos integrales también se pueden convertir implícitamente a decimal, pero los tipos de coma flotante no pueden.

Nota: Esto también significa que la conversión de una de las entradas a otro tipo dará como resultado que toda la respuesta sea de ese tipo. ex: (decimal) a/b * 100.0 = 50.0

tl; dr:

En C#:

int/int = int 
int + decimal = decimal 
decimal + int = decimal 
int/int * decimal = (int/int = int) * decimal = decimal 
int - float = float 
int * double = double 
float/decimal = an error 
int - uint = an error (either that or ulong) 
+0

'100/200 * 100.0' aún sería 0 aunque arroje un resultado decimal. Téngalo en cuenta. – ANeves

+0

@sr pt: El cuarto ejemplo hacia abajo se ocupa de eso. Específicamente, con números sustituidos: '100/200 * 100.0 = (100/200 = 0) * 100.0 = 0.0 ' – Powerlord

Cuestiones relacionadas