Por que essas equações de divisão resultam em zero?

O resultado de todas as equações de divisão no loop abaixo é 0. Como posso obtê-lo para me dar um decimal, por exemplo:

297 / 315 = 0.30793650793650793650793650793651 

Código:

 using System; namespace TestDivide { class Program { static void Main(string[] args) { for (int i = 0; i <= 100; i++) { decimal result = i / 100; long result2 = i / 100; double result3 = i / 100; float result4 = i / 100; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100, result, result2, result3, result4); } Console.ReadLine(); } } } 

Responda:

Obrigado Jon e todo mundo, isso é o que eu queria fazer:

 using System; namespace TestDivide { class Program { static void Main(string[] args) { int maximum = 300; for (int i = 0; i <= maximum; i++) { float percentage = (i / (float)maximum) * 100f; Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage); } Console.ReadLine(); } } } 

Você está usando int / int, que faz tudo na aritmética inteira, mesmo se você estiver atribuindo a uma variável decimal / double / float.

Force um dos operandos a ser do tipo que você deseja usar para a aritmética.

 for (int i = 0; i <= 100; i++) { decimal result = i / 100m; long result2 = i / 100; double result3 = i / 100d; float result4 = i / 100f; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100d, result, result2, result3, result4); } 

Resultados:

 0/100=0 (0,0,0, 0) 1/100=0.01 (0.01,0,0.01, 0.01) 2/100=0.02 (0.02,0,0.02, 0.02) 3/100=0.03 (0.03,0,0.03, 0.03) 4/100=0.04 (0.04,0,0.04, 0.04) 5/100=0.05 (0.05,0,0.05, 0.05) 

(etc)

Note que isso não está mostrando o valor exato representado pelo float ou pelo double - você não pode representar 0.01 exatamente como um float ou double, por exemplo. A formatação de string está efetivamente arredondando o resultado. Veja meu artigo sobre o ponto binário flutuante .NET para obter mais informações, bem como uma class que permitirá que você veja o valor exato de um duplo.

Eu não me incomodei em usar 100L para o resultado2 porque o resultado seria sempre o mesmo.

Experimentar

 i / 100.0 

porque i é um int : i / 100 executa divisão inteira, então o resultado, que é sempre 0, é lançado para o tipo de destino. Você precisa especificar pelo menos um literal não int em sua expressão:

 i / 100.0 

Porque eu é um inteiro e 100 é um inteiro … então você tem uma divisão inteira

Tente (decimal) i / 100.0 em vez

Não importa onde você o armazene, um inteiro dividido por um inteiro sempre será um inteiro.

Você precisa forçar uma operação de ponto flutuante “double / double” em vez de um “int / int”

 double result = (double)297 / (double)315 ; 

isto é divisão por inteiro, qualquer que seja o tipo de variável que você está armazenando, então int / int = int

 double result3 = ((double)i) / 100; 

Porque eu é um valor int e você divide por um inteiro então o resultado é um inteiro! e então você precisa dividir por 100.0 para ter um casting implícito em float ou especificar 100f ou 100d

No meu caso eu tinha apenas vars e sem int

 float div = (var1 - var2) / float.Parse(var1.ToString());