Деление на ноль
Наберите на калькуляторе 5 ÷ 0. Числа на экране не будет: калькулятор покажет ошибку и не станет считать дальше, пока вы его не сбросите. Разделить на ноль нельзя, и калькулятор сразу об этом говорит.
В C# на ноль тоже не разделить, но что случится дальше, зависит от типа чисел. Целые числа и decimal останавливают программу, а double молча выдаёт особое значение и считает дальше.
Целые числа
Деление int на переменную, равную нулю, выбрасывает исключение DivideByZeroException. Исключение — это сигнал об ошибке во время выполнения. Программа печатает сообщение о нём и останавливается на этой строке:
int zero = 0;
Console.WriteLine("Start"); // Start
Console.WriteLine(10 / zero); // ✗
Console.WriteLine("End");Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.Давайте разберём программу по строкам:
int zero = 0;кладёт в переменнуюzeroноль.- Первый вызов
Console.WriteLineпечатаетStart. 10 / zeroвыбрасывает исключение, и программа останавливается.- До последней строки дело не доходит, поэтому
Endне печатается.
Здесь C# ведёт себя как калькулятор: сообщает об ошибке и дальше не считает.
Программа, которая делит int на сам литерал 0, даже не скомпилируется. Компилятор видит ноль заранее и сообщает error CS0020: Division by constant zero. Поэтому в примере ноль сначала кладут в переменную: её значение компилятор заранее не вычисляет.
double
Деление double на ноль программу не останавливает. 1.0 / 0 даёт бесконечность — особое значение типа double, а 0.0 / 0 даёт NaN, «не число». Программа считает дальше уже с этими значениями, поэтому ошибку можно не заметить.
Здесь аналогия с калькулятором заканчивается. Калькулятор показывает ошибку при любом делении на ноль, а double не сообщает ничего.
decimal
decimal ведёт себя как целые числа: деление на ноль выбрасывает DivideByZeroException. Деньги, которые хранят в decimal, не превратятся молча в бесконечность.
Этот вопрос часто задают на собеседовании: что будет, если в C# разделить на ноль? Хороший ответ различает типы:
intиdecimalвыбрасывают исключениеDivideByZeroException;doubleдаёт бесконечность илиNaNи не останавливает программу.
Частая ошибка
Среднее посчитали в double и не проверили, что количество может оказаться нулём:
double total = 0;
int count = 0;
double average = total / count; // ✗
Console.WriteLine(average); // NaNПрограмма не останавливается и печатает NaN. Делимое total имеет тип double, поэтому 0.0 / 0 даёт «не число», а не исключение. Дальше NaN попадёт во все вычисления со средним, и ошибку придётся искать далеко от этой строки. С русскими региональными настройками программа напечатает не число.
Проверяйте делитель до деления: исключения, которое остановит программу, при делении double на ноль не будет.
Главное
- Деление
intиdecimalна ноль выбрасывает исключениеDivideByZeroException, и программа останавливается. - Деление
intна литерал0не компилируется: ошибкаCS0020. doubleпри делении на ноль даёт бесконечность илиNaNи не останавливает программу.