Почему эти уравнения деления приводят к нулю? - PullRequest
9 голосов
/ 30 июля 2009

Результат всех уравнений деления в приведенном ниже цикле for равен 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();
        }
    }
}

Ответ:

Спасибо Джону и всем, вот что я хотел сделать:

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

Ответы [ 10 ]

30 голосов
/ 30 июля 2009

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

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

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)

(и т.д.)

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

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

11 голосов
/ 30 июля 2009

Попробуйте

i / 100.0
5 голосов
/ 30 июля 2009

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

i / 100.0 
2 голосов
/ 30 июля 2009

Потому что я - целое число, а 100 - целое число ... поэтому у вас есть целочисленное деление

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

1 голос
/ 30 июля 2009

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

double result = (double)297 / (double)315 ;
1 голос
/ 30 июля 2009

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

0 голосов
/ 13 сентября 2016

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

float div = (var1 - var2) / float.Parse(var1.ToString());
0 голосов
/ 30 июля 2009
double result3 = ((double)i) / 100;
0 голосов
/ 30 июля 2009

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

0 голосов
/ 30 июля 2009

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

...