2009-02-17 12 views
29

tengo el siguiente código ...Igualdad con Double.NaN

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

que da salida:

NaN USD 

Lo que da?

Estoy usando Double.NaN para indicar que el valor no existe y que no debe salir.

+2

no usan dobles para los precios! – tgamblin

+0

No importa. - Estoy atascado con un formato de base de datos que tiene precio en dobles. Ya he calculado el redondeo. No es tan malo, ya que no estoy haciendo ninguna operación sensible epsilon pesada. Sin embargo, habría diseñado el DB de manera diferente. –

+1

¿ha pensado en convertir los dobles devueltos de la base de datos a un tipo más apropiado a la primera oportunidad? De esta manera, su sistema puede usar el mejor tipo disponible durante el procesamiento, independientemente de cómo un sistema externo (la base de datos) los esté almacenando –

Respuesta

52

Quizás que estás buscando la función estática IsNaN?

intentar algo como esto:

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

Sí, eso lo hizo. –

27

Los estados IEEE 754 floating point standard que la comparación con NaN NaN se siempre retorno falsa. Si debe hacer esto, use Double.isNaN().

Pero esta no es la mejor manera de hacer lo que estás tratando de hacer. Los dobles no son precisos, y los está usando para representar los precios aquí. Apuesto a que, en algún momento, también querrás comparar los precios por la igualdad. Eso no va a funcionar, porque you can't rely on floating point equality.

Debería considerar utilizar un tipo de entero para estos valores (que admita la comparación de igualdad) en lugar de tratar de usar dobles. Los dobles son por problemas científicos; no para las finanzas

+0

Ver comentario a la pregunta original. - Estoy atrapado en una base de datos existente desde hace años. –

8

Double.NaN no es igual a nada, ni siquiera a sí mismo.

Véase el Double.NaN Field en la documentación de la biblioteca de clases .NET Framework:

Uso IsNaN para determinar si un valor no es un número. No es posible determinar si un valor no es un número comparándolo con otro valor igual a NaN.

+1

¡A menos que use '.Equals'! – NetMage

9

Como antecedente: lo que el método IsNaN() hace es return v != v;

+0

No. Consulte [Fuente de referencia] (https://referencesource.microsoft.com/#mscorlib/system/double.cs,b3843db5f359a0fd) – Wizou