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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top