Интегральные типы в .NET используют систему представления двух дополнений для представления. Хотя они могли зарезервировать некоторые битовые шаблоны для специальных значений, они решили не делать этого. double
и float
используют совершенно другую систему представления (IEEE 754), которая резервирует некоторые специальные битовые комбинации для NaN, + Infinity, -Infinity, ...
Одна из причин, по которой значения NaN и Infinity имеют больше смысла для арифметики с плавающей запятой, заключается в том, что операции могут приводить к делению на ноль не только потому, что делитель фактически равен нулю, но и потому, что он слишком мал, чтобы быть представленным типом. В результате, если бы это было не так, вы могли бы сделать некоторые правильные вычисления таинственным образом сгенерировать исключение деления на ноль. Это не произойдет для int
типов, поскольку они являются точными и не имеют ошибки точности.
decimal
предназначен для использования в "реальных" десятичных числах с плавающей запятой. Расчеты double
и float
предназначены для вычислений редко. Что бы NaN
выразил бы для числа реального мира?
Оставив причины этого в покое, это то, что есть, и мы ничего не можем с этим поделать, поэтому лучший путь - использовать обнуляемые типы (они предназначены именно для такой ситуации). Это правильный путь для решения этой проблемы. Если вы не хотите этого делать (а исключения не имеют смысла), вам следует прибегнуть к решению с магическим числом. Если вы решили это сделать, просто убедитесь, что он находится за пределами области допустимых результатов.
РЕДАКТИРОВАТЬ (очень распространенное заблуждение о десятичной дроби):
Как также отмечено в MSDN , decimal
не является фиксированной точкой. Это число с плавающей запятой:
Десятичное число - это значение с плавающей запятой, которое состоит из знака, числового значения, где каждая цифра в значении находится в диапазоне от 0 до 9, и масштабного коэффициента, который указывает положение плавающей десятичной запятой, которая отделяет интеграл и дробные части числового значения.