Операция определяется своими операндами
При делении двух значений целочисленного типа int язык C# вычисляет целочисленный результат. Для семи и двух это три: дробная часть отбрасывается. Результат округляется в направлении нуля. Поэтому для минус семи и двух получается минус три, а не минус четыре. Такое поведение полезно, когда нужны только полные группы. Из семи одинаковых предметов можно составить три полные пары, и один предмет останется. Но для средней величины правило может не подходить: семь выполненных заданий за два дня дают среднее три с половиной задания в день. Сначала нужно определить смысл результата, затем выбрать подходящие типы.
Преобразование должно произойти до деления
Если оба исходных значения имеют тип int, сначала выполняется целочисленное деление. Последующее сохранение полученной тройки в double меняет представление уже вычисленного числа, но не восстанавливает потерянную дробную часть. Данные о ней не были сохранены в результате операции. Чтобы получить дробный результат, один из операндов можно заранее преобразовать к double. Другой простой учебный вариант состоит в использовании числового литерала с дробной частью: выражение 7 / 2.0 вычисляется иначе, чем 7 / 2. В исходном тексте C# точка здесь является частью записи литерала. Отображение числа пользователю и особенности ввода зависят уже от других правил и настроек.
Корректное число ещё должно подходить задаче
Если количество дней приходит текстом, его необходимо преобразовать и проверить до вычисления. Метод int.TryParse для строки сообщает логическим результатом, удалось ли преобразование. Этот признак нужно проверять: неудачу разбора нельзя выдавать за обычный ввод нуля. Но успешное преобразование нуля в число не делает его допустимым делителем. Для примера со средним количеством заданий число дней должно быть положительным. Получаются отдельные проверки: удалось ли прочитать число, подходит ли оно условию задачи и правильно ли выбраны типы для вычисления. Сообщение об ошибке должно соответствовать нарушенному условию. Просьба ввести целое число и просьба указать положительное количество дней объясняют разные проблемы.
Попробуйте на практике
Проследите вычисления на бумаге. Установка среды разработки и запуск программы не требуются.
- Запишите два значения типа int: семь заданий и два дня. Определите результат их деления, затем результат сохранения этого уже вычисленного числа в double.
- Во втором варианте сначала представьте количество заданий как double, а затем выполните деление на два. Сравните полученный результат с первым.
- Повторите рассуждение для целочисленного деления минус семи на два. Укажите, в какую сторону отбрасывается дробная часть.
- Проверьте три условных ввода количества дней: текст два, цифру 0 и цифру 2. Разделите ошибку преобразования, нарушение требования положительности и допустимый ввод.
Как проверить результат. В первом варианте остаётся три, во втором получается три с половиной; отрицательный пример даёт минус три. Словесный ввод не разобран как int, ноль разобран, но недопустим для задачи, а двойка проходит обе проверки.
Частые вопросы
Нужно ли всегда использовать double вместо int?
Нет. Тип выбирают по смыслу данных и требуемой арифметике. Для счётчиков и полных групп целые значения часто уместны; дробный результат нужен не в каждой задаче.
Почему нельзя проверять только получившееся значение после TryParse?
Успешность преобразования является отдельной информацией. Одинаковое числовое значение не всегда позволяет отличить корректный ввод от неудачного разбора, поэтому проверяют логический результат метода.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.