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