Por que eu não posso obter porcentagem usando int
-
25-09-2019 - |
Pergunta
Por favor, perdoe meu conhecimento de programação. Eu sei que isso é uma coisa simples, mas não entendo por que o resultado é sempre 0. Por que decimal ficará bem?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
Muito Obrigado.
Solução
A divisão inteira sempre trunca o restante. Isso é feito no momento em que o número está dividido, não Quando é atribuído à variável (como acho que você assumiu).
decimal c = ((decimal)a / b) * 100;
Outras dicas
O valor A/B retornará sempre 0, pois são inteiros. Então, quando os valores dentro dos colchetes são avaliados, você está tecnicamente fazendo isso
decimal c = (0) * 100
Melhor fazer,
decimal c = ((decimal)a/(decimal)b) * 100
100/200 é 1/2 ou 0,5. Como você está usando o INTs, ele arredonda para 0 (zero). E 0 * 100 ainda é 0. A peça dentro dos parênteses é sempre avaliada primeiro: se você deseja fazer isso funcionar, use:
decimal c = (a * 100) / b;
EDIT: Se você deseja um valor mais preciso em vez de uma "porcentagem inteira" (ou seja, 33.333% em vez de 33%), você deve usar a resposta de Bragaadesh.
A matemática inteira está sendo realizada, e o resultado é então sendo armazenado como um decimal. 100/200 em matemática inteira é 0. Para obter sua porcentagem, fundida pelo menos um valor para decimal antes de fazer o cálculo.
decimal c = (a / (decimal)b) * 100;
Em idiomas fortemente digitados, o resultado de operações matemáticas geralmente é o mesmo tipo que o tipo maior.
C# tem uma lista de Conversões numéricas implícitas vai servir.
Generalizando esta lista: os tipos integrais podem ser convertidos em tipos de pontos flutuantes, mas não vice -versa. Tipos integrais também podem ser implicitamente convertidos para decimal
, mas os tipos de ponto flutuante não podem.
Nota: Isso também significa que o lançamento de um dos INTs para outro tipo resultará em toda a resposta, seja esse tipo. ex: (decimal) a / b * 100.0 = 50.0
tl; dr:
Em 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)
A matemática que está sendo feita ainda é matemática inteira.
(A/B) (100/200 ou 1/2) é feito em dois números inteiros, portanto o resultado é zero. Zero * 100 é ... bem, ainda zero.
O problema que você está enfrentando é com a ordem das operações (A e B são inteiros, portanto, a matemática inteira é realizada).
Eu sugiro isso:
decimal c=((decimal)a)/((decimal)b)*100;
Isso forçará a matemática executada nos valores decimais que você procura.
int pode ser apenas números inteiros, então 100/200 será 0. 0*100 ainda é 0. Altere o tipo para um decimal e funcionará
Faça decimal c = (a * 100) / b;
Enquanto usa números inteiros, este '/' significa div e este '%' para mod. Div é o quociente da divisão, o Mod é o resto. Então, 100/200 = 0 e 100%200 = 100.
Então, você precisa mudar a
e b
tipos para decimal
, no seu caso.