Как происходит разделение двух 32-битных чисел int как (int/int), возвращается мне 0
, но если я использую Decimal.Divide()
, я получаю правильный ответ? Я отнюдь не парень C#.Почему Decimal.Divide (int, int) работает, но не (int/int)?
ответ
int
- целочисленный тип; деление двух цепей выполняет деление , т. е. дробная часть усекается, поскольку она не может быть сохранена в типе результата (также int
!). Decimal
, напротив, получил дробную часть. Вызывая Decimal.Divide
, ваши аргументы int
неявно преобразуются в Decimal
s.
Вы можете применять без целочисленного деления на int
аргументов, явно литье по меньшей мере, один из аргументов типа с плавающей точкой, например:
int a = 42;
int b = 23;
double result = (double)a/b;
Правильный и лаконичный. – nsantorello
Хороший ответ. Я также пробовал Decimal.Divide (a, b), который дал тот же результат. – Baxter
работа подобный очарование!. – Bhimbim
Я считаю Decimal.Divide(decimal, decimal)
неявно преобразует его 2 ИНТА аргументов знаков после запятой перед возвратом десятичного значения (точнее), где, как 4/5 трактуются как целочисленное деление и возвращает 0
В первом случае, вы делаете целое деление, поэтому результат усекается (десятичная часть прерывается) и возвращается целое число.
Во втором случае функции int сначала преобразуются в десятичные числа, а результат - десятичной. Следовательно, они не усекаются, и вы получаете правильный результат.
В следующей строке:
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
Вы хотите ввести цифры:
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();
}
Ответ помечается как таковой почти нет, но я думаю, что стоит добавить, что существует разница между использованием двойной и десятичной.
я бы не сделать лучшую работу, объясняя понятия, чем Википедии, так что я буду просто предоставить указатели:
В финансовых системах, часто требуется, чтобы мы может гарантировать определенное количество (базис-10) десятичных знаков точности. Это вообще невозможно, если входные/исходные данные находятся в базе-10, но мы выполняем арифметику в базе-2 (поскольку число десятичных знаков, необходимое для десятичного разложения числа, зависит от базы, третья - бесконечно много десятичных места для выражения в базе-10 как 0,3333333 ..., но в базе-3: 0,1).
Числа с плавающей запятой работают быстрее (с точки зрения процессорного времени, по программированию они одинаково просты) и предпочтительны, когда вы хотите минимизировать ошибку округления (как в научных приложениях).
Ничто в вашем ответе не отвечает на исходный вопрос – LordWilmore
- 1. setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) не работает
- 2. Почему int/int = int?
- 3. Почему Int (false) работает, но Int (booleanVariable) нет?
- 4. Почему это не работает: `int arr [size]`, но это делает `int * arr = new int [size]`?
- 5. Почему int + BigDecimal не работает?
- 6. Почему не этот [Int] -Element типа 'Int'?
- 7. Почему reinterpret_cast не конвертирует int в int?
- 8. int 21h не работает
- 9. Понимание ошибки типа: «ожидается подпись Int * Int-> Int но получил Int * Int-> Int»
- 10. Почему протокол CustomStringConvertible не работает для Int?
- 11. Короткое использование Int typeworking не работает почему?
- 12. Почему (int) '\ xff'! = 0xff, но (int) '\ x7f' == 0x7f?
- 13. Почему нет! Int() работает нормально?
- 14. Почему BIGINT/INT не работает в Netezza
- 15. Отправка `int` конструктору, но компилятор отправить` Int & `
- 16. Int преобразования не работает
- 17. (int) не работает?
- 18. Конструктор Polygon (int [], int [], int) не определено
- 19. RadioGroup.check (int) не работает
- 20. Конструктор Time_Class_sub (int, int, int) не определен
- 21. setContentView (int) не работает
- 22. Int() не работает должным образом
- 23. Почему матрицы int не неизменяемы?
- 24. Почему (String, Int) ожидается вместо (Char, Int)?
- 25. Django INT сравнение не работает
- 26. Unsigned int не работает C++
- 27. Почему тип int работает с sscanf, но int16_t нет?
- 28. Почему int r = (int, int, int); не дает ошибку, а r имеет значение последнего целого числа?
- 29. Почему List [Int, Int] не является допустимым типом Scala?
- 30. Почему - (int) int - любая значение int, значение r?
Можете ли вы привести конкретный пример? Десятичный тип отличается от Int32. – Groo
Кстати, я нашел [Decimal.Divide] (https://msdn.microsoft.com/en-us/library/system.decimal.divide%28v=vs.110%29.aspx) только принимает десятичные числа в качестве входных данных. – Ravi