Равенство с Double.NaN - PullRequest
       16

Равенство с Double.NaN

31 голосов
/ 17 февраля 2009

У меня есть следующий код ...

if (Price_Foreign != Double.NaN)
{
   output.Append(spacer);
   output.Append(String.Format("{0,-10:C} USD",Price_Foreign));
}

Какие выходы:

NaN USD

Что дает?

Я использую Double.NaN, чтобы указать, что значение не существует и не должно выводиться.

Ответы [ 4 ]

56 голосов
/ 17 февраля 2009

Возможно, вы ищете статическую функцию IsNaN?

Попробуйте что-то вроде этого:

if (!Double.IsNaN(Price_Foreign))
{
   output.Append(spacer);
   output.Append(String.Format("{0,-10:C} USD",Price_Foreign));
}
29 голосов
/ 17 февраля 2009

Стандарт *1001* IEEE 754 с плавающей запятой гласит, что сравнение NaN с NaN всегда возвращает false. Если вы должны сделать это, используйте Double.isNaN ().

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

Вам действительно следует использовать некий целочисленный тип для этих значений (который поддерживает сравнение на равенство), а не пытаться использовать двойные числа. Двойники для научных задач; не для финансов.

9 голосов
/ 24 мая 2010

В качестве справочной информации: метод IsNaN() делает return v != v;

8 голосов
/ 17 февраля 2009

Double.NaN не равно ничему, даже самому себе.

См. Поле Double.NaN в документации библиотеки классов .NET Framework:

Используйте IsNaN , чтобы определить, является ли значение это не число. Не возможно определить, является ли значение не число, сравнивая его с другим значение, равное NaN.

...