Перейти к содержимому
Теория · Операторы · урок 8 из 10

Деление на ноль

Наберите на калькуляторе 5 ÷ 0. Числа на экране не будет: калькулятор покажет ошибку и не станет считать дальше, пока вы его не сбросите. Разделить на ноль нельзя, и калькулятор сразу об этом говорит.

В C# на ноль тоже не разделить, но что случится дальше, зависит от типа чисел. Целые числа и decimal останавливают программу, а double молча выдаёт особое значение и считает дальше.

Целые числа

Деление int на переменную, равную нулю, выбрасывает исключение DivideByZeroException. Исключение — это сигнал об ошибке во время выполнения. Программа печатает сообщение о нём и останавливается на этой строке:

C#
int zero = 0;
Console.WriteLine("Start"); // Start
Console.WriteLine(10 / zero); // ✗
Console.WriteLine("End");
TEXT
Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.

Давайте разберём программу по строкам:

  1. int zero = 0; кладёт в переменную zero ноль.
  2. Первый вызов Console.WriteLine печатает Start.
  3. 10 / zero выбрасывает исключение, и программа останавливается.
  4. До последней строки дело не доходит, поэтому 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 и не проверили, что количество может оказаться нулём:

C#
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 и не останавливает программу.