Pergunta

Como é dividir dois números int 32 bits como (int / int) retorna para me 0, mas se eu usar Decimal.Divide() que recebo a resposta correta? Eu sou de nenhuma maneira um cara c #.

Foi útil?

Solução

int é um tipo de número inteiro; dividindo dois ints executa um inteira divisão, ou seja, a parte fracionária é truncada, uma vez que não pode ser armazenado no tipo de resultado (também int!). Decimal, pelo contrário, tem uma parte fracionária. Ao invocar Decimal.Divide, seus argumentos int se implicitamente convertido para Decimals.

Você pode aplicar divisão não inteiro em argumentos int lançando explicitamente pelo menos um dos argumentos para um tipo de ponto flutuante, por exemplo:.

int a = 42;
int b = 23;
double result = (double)a / b;

Outras dicas

No primeiro caso, você está fazendo a divisão inteira, então o resultado é truncado (a parte decimal é cortada) e um inteiro é retornado.

No segundo caso, os inteiros são convertidos em decimais primeiro lugar, e o resultado é um decimal. Portanto, eles não são truncados e você obter o resultado correto.

A seguinte linha:

int a = 1, b = 2;
object result = a / b;

... será executada utilizando inteiro aritmética . Decimal.Divide por outro lado, leva dois parâmetros do tipo Decimal, então a divisão será realizada em valores decimais em vez de valores inteiros. Isso é equivalente a esta:

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

Para examinar isso, você pode adicionar as seguintes linhas de código depois de cada um dos exemplos acima:

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

A saída no primeiro caso será

0
System.Int32

.. e no segundo caso:

0,5
System.Decimal

Eu acho Decimal.Divide(decimal, decimal) converte implicitamente seus 2 argumentos int para decimais antes de retornar um valor decimal (preciso) onde, como 4/5 é tratado como divisão de inteiros e retorna 0

Você quer lançar os números:

dupla C = (duplo) a / (double) b;

Nota: Se algum dos argumentos em C # é um casal, uma dupla divisão é utilizado o que resulta em um duplo. Então, o seguinte seria muito trabalho:

dupla C = (duplo) a / b;

Aqui está um programa pequeno:

static void Main(string[] args)
        {
            int a=0, b = 0, c = 0;
            int n = Convert.ToInt16(Console.ReadLine());
            string[] arr_temp = Console.ReadLine().Split(' ');
            int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
            foreach (int i in arr)
            {
                if (i > 0) a++;
                else if (i < 0) b++;
                else c++;
            }
            Console.WriteLine("{0}", (double)a / n);
            Console.WriteLine("{0}", (double)b / n);
            Console.WriteLine("{0}", (double)c / n);
            Console.ReadKey();
        }

Se você estiver procurando por 0

No meu caso nada funcionou acima.

o que eu quero fazer é dividir 278 por 575 e multiplique por 100 para encontrar percentual.

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%: 48,3478260869565 -> 278/575 ---> 0 %: 51,6521739130435 -> 297/575 ---> 0

se eu multiplicar o PeopleCount de 1,0 torna decimal ea divisão será 48,34 ... também multiplicar por 100,0 não 100.

A resposta marcada como tal, é quase lá, mas acho que vale a pena acrescentar que há uma diferença entre usar double e decimal.

Eu não faria um trabalho melhor de explicar os conceitos do que Wikipedia, por isso vou apenas fornecer os ponteiros:

de ponto flutuante aritmética

decimal tipo de dados

Em sistemas financeiros, muitas vezes é uma exigência que podemos garantir um certo número de (base-10) exatidão casas decimais. Este é geralmente impossível, se os dados de entrada / fonte está na base-10, mas nós executar a aritmética de base-2 (porque o número de casas decimais necessário para a expansão decimal de um número depende da base; um terço tem infinitamente muitos decimal lugares para expressar em base-10 como 0,333333 ..., mas leva apenas uma casa decimal em base-3: 0,1).

números de ponto flutuante são mais rápidos para trabalhar com (em termos de tempo de CPU; programação-wise eles são igualmente simples) e preferenciais sempre que quiser para minimizar erros de arredondamento (como em aplicações científicas).

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