c# - sacar - ¿Por qué no puedo obtener el porcentaje utilizando Int
cuanto es el 20 por ciento de 100 (9)
Por favor perdona mis conocimientos 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?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Muchas gracias.
100/200 es 1/2 o 0.5. Como está usando ints, se redondea a 0 (cero). Y 0 * 100 sigue siendo 0. La parte dentro de los paréntesis siempre se evalúa primero: si desea que esto funcione, use:
decimal c = (a * 100) / b;
Edición: si desea un valor más preciso en lugar de un "porcentaje entero" (es decir, 33.333% en lugar del 33%), debe usar la respuesta de Bragaadeesh.
El valor a / b devolverá 0 siempre que sean enteros. Entonces, cuando se evalúan los valores dentro de los corchetes, técnicamente está haciendo esto
decimal c = (0) * 100
Mejor hacer
decimal c = ((decimal)a/(decimal)b) * 100
En lenguajes fuertemente tipados, el resultado de las operaciones matemáticas es generalmente el mismo tipo que el tipo más grande.
C # tiene una lista de conversiones numéricas implícitas que hará.
Generalización de esta lista: los tipos integrales se pueden convertir en tipos de punto flotante, pero no al revés. Los tipos integrales también se pueden convertir implícitamente a decimal
, pero los tipos de punto flotante no se pueden convertir.
Nota: Esto también significa que la conversión de uno de los ints a otro tipo dará como resultado que toda la respuesta sea ese tipo. Ej: (decimal) a / b * 100.0 = 50.0
tl; dr:
Cía#:
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)
Hazlo decimal c = (a * 100) / b;
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;
La matemática de enteros se está realizando y el resultado se almacena como un decimal. 100/200 en números enteros es 0. Para obtener su porcentaje, convierta al menos un valor a decimal antes de hacer el cálculo.
decimal c = (a / (decimal)b) * 100;
Las matemáticas que se están haciendo son todavía matemáticas enteras.
(a / b) (100/200 o 1/2) se realiza con dos enteros, por lo que el resultado es cero. Cero * 100 es ... bueno, sigue siendo cero.
El problema que está experimentando es con el orden de las operaciones (a y b son enteros, por lo que se realiza matemática de enteros).
Sugiero esto:
decimal c=((decimal)a)/((decimal)b)*100;
Esto forzará la matemática realizada a los valores decimales que buscas.
Mientras se usan enteros, este ''/'' significa DIV y este ''%'' para MOD. DIV es el cociente de la división, MOD es el resto. Entonces, 100/200 = 0 y 100% 200 = 100.
Por lo tanto, necesita cambiar los tipos b
al decimal
, en su caso.
int solo puede ser números enteros, por lo que 100/200 será 0. 0 * 100 sigue siendo 0. Cambia el tipo a decimal y funcionará