Подтвердить что ты не робот

Почему Нан (не число) доступно только для парных?

У меня есть бизнес-класс, который содержит два свойства с нулевым десятичным значением. Третье свойство возвращает результат умножения двух других свойств. Если HasValue истинно для двух типов с нулевым значением, я умножаю и возвращаю результат. У меня есть несколько вариантов возвращаемого значения, если одно или оба свойства имеют значение null:

  • Возврат 0
  • Выбросить исключение
  • Возвращает магическое число (-1)
  • Возвращает десятичное число? (EDIT - см. Комментарии)

Я думал, что одним из моих вариантов было бы вернуть NaN, но я вижу, что это возможно только для двойного типа. Почему это?

Для записи возвращение 0 имеет наибольший смысл в этом случае и то, что я планирую делать, если у кого-то нет лучшего предложения.

4b9b3361

Ответ 1

Интегральные типы в .NET используют две системы дополнений для представления. Хотя они могли зарезервировать несколько шаблонов бит для специальных значений, они решили не делать этого. double и float используют совершенно другую систему представления (IEEE 754), которая резервирует некоторые специальные битовые шаблоны для NaN, + Infinity, -Infinity,...

Одна из причин того, что значения NaN и Infinity имеют большее значение для арифметики с плавающей запятой, состоит в том, что операции могут приводить к делению на ноль, причем не только потому, что делитель фактически равен нулю, а потому, что он слишком мал, чтобы быть представлен типом. В результате, если бы это было не так, вы могли бы иметь какой-то действительный расчет, таинственным образом делить деление на нулевое исключение. Это не произойдет для типов int, поскольку они точны и не имеют ошибки точности.

decimal предназначен для использования для чисел чисел с плавающей запятой "реальный мир". Он редко подвергается вычислениям, которые предназначены для double и float. Что бы выразить NaN для реального номера мира?

Оставляя причины только в одиночку, это то, что есть, и мы ничего не можем с этим поделать, поэтому лучший путь - использовать типы с нулевым значением (они предназначены для помощи именно в такой ситуации). Это правильный способ решить эту проблему. Если вы не хотите этого делать (и исключения не имеют смысла), вы должны прибегнуть к решению магического номера. Если вы решили сделать это, просто убедитесь, что он находится за пределами допустимых результатов.

EDIT (очень распространенное заблуждение о десятичном значении):

Как отмечалось в MSDN, decimal не является фиксированной точкой. Это число с плавающей запятой:

Десятичное число - это значение с плавающей запятой, которое состоит из знака, числового значения, где каждая цифра в значении находится в диапазоне от 0 до 9 и коэффициент масштабирования, который указывает положение плавающей десятичной точки, которая отделяет интеграл и дробные части числового значения.

Ответ 2

Чтобы разрешить NAN и Infinity, используйте этот

if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue))
{
    YourValue = 0;
}