Почему эти уравнения деления приводят к нулю?

Результатом всех уравнений деления в цикле ниже является 0. Как я могу заставить его дать десятичное число, например:

297 / 315 = 0.30793650793650793650793650793651 

Код:

 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(); } } } 

Ответ:

Спасибо Jon и всем, вот что я хотел сделать:

 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(); } } } 

    Вы используете int / int, который делает все в целочисленной арифметике, даже если вы назначаете переменную decimal / double / float.

    Заставьте один из операндов быть типом, который вы хотите использовать для арифметики.

     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); } 

    Результаты:

     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) 

    (и т.д)

    Обратите внимание, что это не показывает точное значение, представленное float или double - вы не можете представить 0.01 точно как float или double, например. Форматирование строк эффективно округляет результат. См. Мою статью о плавающей двоичной точке .NET для получения дополнительной информации, а также classа, который позволит вам увидеть точное значение double.

    Я не потрудился использовать result2 для result2 потому что результат всегда был бы таким же.

    Пытаться

     i / 100.0 

    потому что i является int : i / 100 выполняет целочисленное деление, тогда результат, который всегда равен 0, подчиняется целевому типу. Вам нужно указать хотя бы один неинтеллектуальный литерал в вашем выражении:

     i / 100.0 

    Поскольку i является целым числом, а 100 является целым числом … так что у вас есть целочисленное деление

    Попробуйте (десятичный) i / 100.0 вместо

    Независимо от того, где вы храните его, целое число, деленное на целое число, всегда будет целым числом.

    Вам нужно принудительно выполнить операцию с плавающей запятой «double / double» вместо «int / int»,

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

    это целочисленное деление, независимо от типа переменной, которую вы храните, поэтому int / int = int

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

    Поскольку i является значением int, и вы делите на целое число, поэтому результат представляет собой целое число! и поэтому вам нужно разделить на 100.0, чтобы иметь неявное приведение в float или указать 100f или 100d

    В моем случае у меня были только вары и нет int

     float div = (var1 - var2) / float.Parse(var1.ToString()); 
    Давайте будем гением компьютера.