2009-06-25 3 views
80

Как происходит разделение двух 32-битных чисел int как (int/int), возвращается мне 0, но если я использую Decimal.Divide(), я получаю правильный ответ? Я отнюдь не парень C#.Почему Decimal.Divide (int, int) работает, но не (int/int)?

+1

Можете ли вы привести конкретный пример? Десятичный тип отличается от Int32. – Groo

+0

Кстати, я нашел [Decimal.Divide] (https://msdn.microsoft.com/en-us/library/system.decimal.divide%28v=vs.110%29.aspx) только принимает десятичные числа в качестве входных данных. – Ravi

ответ

158

int - целочисленный тип; деление двух цепей выполняет деление , т. е. дробная часть усекается, поскольку она не может быть сохранена в типе результата (также int!). Decimal, напротив, получил дробную часть. Вызывая Decimal.Divide, ваши аргументы int неявно преобразуются в Decimal s.

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

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

Правильный и лаконичный. – nsantorello

+2

Хороший ответ. Я также пробовал Decimal.Divide (a, b), который дал тот же результат. – Baxter

+0

работа подобный очарование!. – Bhimbim

0

Если вы ищете 0 < < 1 ответ , int/int будет недостаточно. int/int выполняет целочисленное деление. Попробуйте отличить один из int к двойнику внутри операции.

+1

Int32 - целое число со знаком, вы имели в виду 0 Groo

+0

Ха, да, спасибо за улов! – Brian

2

Я считаю Decimal.Divide(decimal, decimal) неявно преобразует его 2 ИНТА аргументов знаков после запятой перед возвратом десятичного значения (точнее), где, как 4/5 трактуются как целочисленное деление и возвращает 0

6

В первом случае, вы делаете целое деление, поэтому результат усекается (десятичная часть прерывается) и возвращается целое число.

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

3

В следующей строке:

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

... будет выполнено с использованием целочисленной арифметики. Decimal.Divide, с другой стороны, принимает два параметра типа Decimal, поэтому деление будет выполняться по десятичным значениям, а не по целочисленным значениям. Это эквивалентно этому:

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

Чтобы проверить это, вы можете добавить следующие строки кода после каждого из приведенных выше примеров:

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

Выход в первом случае будет

0 
System.Int32 

..и во втором случае:

0,5 
System.Decimal 
1

Вы хотите ввести цифры:

double c = (double) a/(double) b;

Примечание: Если какой-либо из аргументов в C# является двойным, используется двойной разделитель, который приводит к двойному.Таким образом, следующее будет работать также:

double c = (double) a/b;

здесь это небольшая программа:

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

Ответ помечается как таковой почти нет, но я думаю, что стоит добавить, что существует разница между использованием двойной и десятичной.

я бы не сделать лучшую работу, объясняя понятия, чем Википедии, так что я буду просто предоставить указатели:

floating-point arithmetic

decimal data type

В финансовых системах, часто требуется, чтобы мы может гарантировать определенное количество (базис-10) десятичных знаков точности. Это вообще невозможно, если входные/исходные данные находятся в базе-10, но мы выполняем арифметику в базе-2 (поскольку число десятичных знаков, необходимое для десятичного разложения числа, зависит от базы, третья - бесконечно много десятичных места для выражения в базе-10 как 0,3333333 ..., но в базе-3: 0,1).

Числа с плавающей запятой работают быстрее (с точки зрения процессорного времени, по программированию они одинаково просты) и предпочтительны, когда вы хотите минимизировать ошибку округления (как в научных приложениях).

+0

Ничто в вашем ответе не отвечает на исходный вопрос – LordWilmore

Смежные вопросы