Кто-нибудь знает, почему целочисленное деление в C # возвращает целое число, а не число с плавающей запятой? В чем идея? (Это только наследие C / C ++?)
В C #:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
Результатом этого кода будет:
'Hello world'
Строго говоря, целочисленного деления не существует (деление по определению - это операция, производящая рациональное число, целые числа - очень небольшое подмножество этого числа).
integer
разделение, а неfloating point
разделение.Ответы:
В то время как новички часто совершают эту ошибку, выполняя целочисленное деление, когда на самом деле намеревались использовать деление с плавающей запятой, на практике целочисленное деление является очень распространенной операцией. Если вы предполагаете, что люди редко его используют и что каждый раз, когда вы выполняете деление, вам всегда нужно помнить о приведении к числам с плавающей запятой, вы ошибаетесь.
Во-первых, целочисленное деление происходит немного быстрее, поэтому, если вам нужен только результат целого числа, можно использовать более эффективный алгоритм.
Во-вторых, существует ряд алгоритмов, использующих целочисленное деление, и если бы результат деления всегда был числом с плавающей запятой, вам пришлось бы каждый раз округлять результат. Один из самых неуместных примеров - изменение основания числа. Вычисление каждой цифры включает целочисленное деление числа вместе с остатком, а не деление числа с плавающей запятой.
По этим (и другим связанным) причинам целочисленное деление дает целое число. Если вы хотите получить деление двух целых чисел с плавающей запятой, вам просто нужно не забыть привести одно к
double
/float
/decimal
.источник
/
будет ли оператор выполнять целочисленное деление или деление с плавающей запятой (если вы не используете динамическое). Если это трудно для вас , чтобы понять это , потому что вы делаете так много на этой одной линии, то я предложил бы ломать эту линию на несколько строк так , чтобы его легче понять, операнды ли целые числа или типа с плавающей точкой. Будущие читатели вашего кода, вероятно, оценят это.int/int
оператор был бы просто недопустимым [с диагностикой, указывающей, что код должен приводить операнд или использовать другой оператор, в зависимости от желаемого поведения]. Если бы для целочисленного деления была доступна какая-либо другая хорошая последовательность токенов, можно было бы отказаться от использования/
для этой цели, но я не знаю, что было бы практично.См. Спецификацию C # . Есть три типа операторов деления
В вашем случае у нас есть целочисленное деление со следующими правилами:
Я думаю, что причина, по которой C # использует этот тип деления для целых чисел (некоторые языки возвращают плавающий результат), аппаратная - деление целых чисел происходит быстрее и проще.
источник
Каждый тип данных может перегрузить каждый оператор. Если и числитель, и знаменатель являются целыми числами, целочисленный тип выполнит операцию деления и вернет целочисленный тип. Если вы хотите деление с плавающей запятой, вы должны привести одно или несколько чисел к типам с плавающей запятой, прежде чем делить их. Например:
или, если вы используете литералы:
Имейте в виду, что числа с плавающей запятой неточны. Если вам важна точность, используйте вместо этого что-то вроде десятичного типа.
источник
Поскольку вы не используете суффикс, литералы
13
и4
интерпретируются как целые числа:Таким образом, поскольку вы объявляете
13
целое число, будет выполнено целочисленное деление:И так происходит округление в меньшую сторону:
Если вы сделаете следующее:
Вы получите ошибку компилятора, поскольку деление с плавающей запятой (
/
оператор of13f
) приводит к получению числа с плавающей запятой, которое не может быть неявно преобразовано в int.Если вы хотите, чтобы деление было делением с плавающей запятой, вам нужно сделать результат с плавающей запятой:
Обратите внимание, что вы по-прежнему делите целые числа, которые неявно будут преобразованы в float: результат будет
3.0
. Чтобы явно объявить операнды как float, используяf
суффикс (13f
,4f
).источник
1.0
.Это просто базовая операция .
Вспомните, когда вы научились делить. Вначале мы решили
9/6 = 1 with remainder 3
.Оператор / в сочетании с оператором% используются для получения этих значений.
источник
Может быть полезно:
источник
2.5
, not2
.Результат всегда будет иметь тип, который имеет больший диапазон числителя и знаменателя. Исключения бывают байтовыми и короткими, что дает int (Int32).
Неявного преобразования между типами с плавающей запятой и десятичным типом нет, поэтому деление между ними не допускается. Вы должны явно указать и решить, какой из них вы хотите (Decimal имеет большую точность и меньший диапазон по сравнению с типами с плавающей запятой).
источник