Por que dividir dois números int de 32 bits como (int / int) retorna para mim 0
, mas se eu usar Decimal.Divide()
, obtenho a resposta correta? Não sou um cara c #.
Por que dividir dois números int de 32 bits como (int / int) retorna para mim 0
, mas se eu usar Decimal.Divide()
, obtenho a resposta correta? Não sou um cara c #.
Respostas:
int
é um tipo inteiro; dividir dois ints realiza uma divisão inteira , ou seja, a parte fracionária é truncada, pois não pode ser armazenada no tipo de resultado (também int
!). Decimal
, ao contrário, tem uma parte fracionária. Ao invocar Decimal.Divide
, seus int
argumentos são convertidos implicitamente em Decimal
s.
Você pode impor a divisão não inteira em int
argumentos convertendo explicitamente pelo menos um dos argumentos em um tipo de ponto flutuante, por exemplo:
int a = 42;
int b = 23;
double result = (double)a / b;
No primeiro caso, você está fazendo uma divisão inteira, então o resultado é truncado (a parte decimal é cortada) e um inteiro é retornado.
No segundo caso, os ints são convertidos em decimais primeiro, e o resultado é um decimal. Portanto, eles não são truncados e você obtém o resultado correto.
A seguinte linha:
int a = 1, b = 2;
object result = a / b;
... será executado usando aritmética inteira . 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 isto:
int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;
Para examinar isso, você pode adicionar as seguintes linhas de código após 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
Você deseja lançar os números:
duplo c = (duplo) a / (duplo) b;
Nota: Se algum dos argumentos em C # for duplo, uma dupla divisão será usada, resultando em uma dupla. Portanto, o seguinte também funcionaria:
duplo c = (duplo) a / b;
aqui está um pequeno programa:
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();
}
No meu caso, nada funcionou acima.
o que eu quero fazer é dividir 278 por 575 e multiplicar por 100 para encontrar a porcentagem.
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 por 1,0, torna-se decimal e a divisão será 48,34 ... multiplique também por 100,0, não 100.
A resposta marcada como tal está quase lá, mas acho que vale a pena acrescentar que há uma diferença entre usar duplo e decimal.
Eu não faria um trabalho melhor explicando os conceitos do que a Wikipedia, então irei apenas fornecer as dicas:
Em sistemas financeiros, é freqüentemente um requisito que possamos garantir um certo número de (base 10) casas decimais de precisão. Isso geralmente é impossível se os dados de entrada / fonte estão na base 10, mas fazemos a aritmética na base 2 (porque o número de casas decimais necessárias para a expansão decimal de um número depende da base; um terço leva infinitas casas decimais casas para expressar na base 10 como 0,333333 ..., mas leva apenas uma casa decimal na base 3: 0,1).
Os números de ponto flutuante são mais rápidos de se trabalhar (em termos de tempo de CPU; em termos de programação, eles são igualmente simples) e preferidos sempre que você quiser minimizar o erro de arredondamento (como em aplicativos científicos).