Как сделать так, что бы при делении было десятичное число в C#?
в вашем случае при делении int на int вы получите int (уже до целого преобразованное) и только потом его скастует в sum (decimal).
- Вконтакте

по сути оператор деление имеет несколько перегрузок
вы вызвали
Divide(int,int)
оно возвращает целое значение.
а надо вызывать
Divide(decimal ,int)
Тогда вернет дробное и корректно посчитает))
При делении чисел пропадает дробная часть
Я делю два числа друг на друга, например 1 / 2 и ожидаю получить в результате 0.5 , так как присваиваю результат переменной с плавающей точкой, но получаю 0 . Вот код:
В чём может быть проблема?
![]()
Дело в том, что в C++, а равно как и в C, C#, Java и многих других языках деление целых чисел даёт исключительно целый же результат, т.е. дробная часть просто отбрасывается.
Стандарт языка буквально так это и говорит [expl.mul]:
For integral operands the / operator yields the algebraic quotient with any fractional part discarded;
Подобное поведение обусловлено в первую очередь производительность, т.к. целочисленная арифметика обычно работает быстрее арифметики с плавающей точкой.
То, что результат деления целых чисел присваивается переменной с плавающей точкой не влияет на само деление, т.к. присваивание выполняется уже после факта деления. И мы просто инициализируем вещественную переменную d целым значением 0 , которое никак не даст нам чего-то с ненулевой дробной частью, например, ожидаемых 0.5 .
Чтобы всё-таки добиться желаемого результата нужно производить вещественное деление. Для этого достаточно хотя бы один из операндов привести к вещественному типу. Сделать это можно разными способами. Если используется константа, то достаточно дописать в конце неё точку, например:
Это выглядит минималистично, но иногда несколько странно, т.к. в математике подобная запись не используется. Для большей наглядности стоит добавить .0 , получим:
Если вместо явного числового литерала используется именованная целочисленная переменная, или функция, возвращающая целый тип, то добавлением точки с нулём проблему уже не решить, и нужно выполнять иное приведение типа, т.е. делать static_cast :
Но можно использовать и умножение (или деление) любого операнда на 1.0 , что так же преобразует результат, который будет выступать операндом последующего деления, к вещественному типу:
Альтернативным вариантом может быть прибавка (или вычитание) вещественного нуля:
Однако, вариант со static_cast будет более правильным, т.к. такие преобразования всегда легче находить в тексте программы, нежели обычные плавающие константы.
Ну и конечно же, если речь идёт о переменных или функциях, то можно просто изменить их тип:
В такой ситуации надо не забывать, что использование one и two в других контекстах так же может давать иные результаты, что были раньше. Поэтому задачу всё же лучше локализовать, и не делать всё поголовно в программе вещественного типа, если это требуется только в некоторых частных случаях.
5.2 – Арифметические операторы
В C++ есть два унарных арифметических оператора, плюс (+) и минус (-). Напоминаем, что унарные операторы – это операторы, которые принимают только один операнд.
| Оператор | Обозначение | Пример использования | Операция |
|---|---|---|---|
| Унарный плюс | + | +x | Значение x |
| Унарный минус | — | -x | Отрицательное значение x |
Оператор унарного минуса возвращает операнд, умноженный на -1 . Другими словами, если x = 5 , -x равно -5 .
Оператор унарного плюса возвращает значение операнда. Другими словами, +5 равно 5 , а +x равно x . Как правило, вам не нужно использовать этот оператор, поскольку он избыточен. Он был добавлен в основном для обеспечения симметрии с унарным оператором минус.
Для наилучшего эффекта оба этих оператора следует размещать непосредственно перед операндом (например, -x , а не — x ).
Не путайте оператор унарного минуса с оператором бинарного вычитания, в котором используется тот же символ. Например, в выражении x = 5 — -3; первый минус – это оператор бинарного вычитания, а второй – оператор унарного минуса.
Бинарные арифметические операторы
В C++ есть 5 бинарных арифметических операторов. Бинарные операторы – это операторы, которые принимают левый и правый операнды.
| Оператор | Обозначение | Пример использования | Операция |
|---|---|---|---|
| Сложение | + | x + y | x плюс y |
| Вычитание | — | x — y | x минус y |
| Умножение | * | x * y | x , умноженное на y |
| Деление | / | x / y | x , деленное на y |
| Остаток от деления | % | x % y | остаток от деления x на y |
Операторы сложения, вычитания и умножения работают так же, как и в реальной жизни, без каких-либо оговорок.
Деление и остаток от деления требуют дополнительных пояснений. О делении мы поговорим ниже, а об остатке от деления – в следующем уроке.
Целочисленное деление и деление с плавающей запятой
Проще всего представить себе, что оператор деления имеет два разных «режима».
Если один (или оба) операнда являются значениями с плавающей точкой, оператор деления выполняет деление с плавающей точкой. Деление с плавающей точкой возвращает значение с плавающей точкой, и дробная часть сохраняется. Например, 7.0 / 4 = 1.75 , 7 / 4.0 = 1.75 и 7.0 / 4.0 = 1.75 . Как и во всех арифметических операциях с плавающей точкой, здесь могут возникать ошибки округления.
Если оба операнда являются целыми числами, оператор деления вместо этого выполняет целочисленное деление. Целочисленное деление отбрасывает любые дробные части и возвращает целочисленное значение. Например, 7 / 4 = 1 , потому что дробная часть результата отбрасывается. Точно так же -7 / 4 = -1 , потому что дробная часть опускается.
Предупреждение
До C++11 целочисленное деление с отрицательным операндом могло округляться в большую или меньшую сторону. Таким образом, -5 / 3 могло дать результат -1 или -2 . Это было исправлено в C++11, где дробная часть всегда отбрасывается (округляется до 0).
Использование static_cast<> для деления с плавающей точкой с целочисленными значениями
Сказанное выше поднимает вопрос: если у нас есть два целых числа и мы хотим разделить их без потери дробной части, как нам это сделать?
В уроке «4.11 – Символы» мы показали, как можно использовать оператор static_cast<> для преобразования значения char в целочисленный тип, чтобы оно печаталось как целое число, а не как символ.
Аналогичным образом мы можем использовать static_cast<> для преобразования значения целочисленного типа в число с плавающей точкой, чтобы мы, вместо целочисленного деления, смогли выполнить деление с плавающей точкой. Рассмотрим следующий код:
Приведенный выше пример показывает, что если любой из операндов является числом с плавающей точкой, результатом будет деление с плавающей точкой, а не целочисленное деление.
Деление на ноль
Попытка разделить на 0 (или 0.0) обычно приводит к сбою программы, так как результаты математически не определены!
Это работает, но немного неудобно и требует для выполнения двух операторов ( operator+ и operator= ).
Поскольку написание таких инструкций, как x = x + 4 , очень распространено, C++ для удобства предоставляет пять арифметических операторов присваивания. Вместо того, чтобы писать x = x + 4 , вы можете написать x += 4 . Вместо x = x * y вы можете написать x *= y .
Как получить десятичные числа в C ++, если я использую целочисленные переменные
Вы делите два int s, так что вы будете вызывать целочисленное деление, которое усекает все десятичные дроби. Вы можете изменить свой int в double и вы будете хранить десятичные дроби.
Cyber-х ответ правильный что ты делаешь целочисленное деление. Если вы хотите, чтобы x и y были целыми числами (чтобы сохранить входные значения), только div должен быть удвоен:
Статическая трансляция будет обеспечивать деление с плавающей запятой, но вы получаете преимущество, сохраняя х и у целые числа.
Но вы все равно не увидите два десятичных знака по умолчанию при выводе. Используйте std :: fixed и std :: setprecision (2), чтобы ограничить вывод.