remarks generate example c# types

generate - params comments c#



¿Por qué NaN(no es un número) solo está disponible para dobles? (2)

Tengo una clase de negocios que contiene dos propiedades decimales anulables. Una tercera propiedad devuelve el resultado de multiplicar las otras dos propiedades. Si HasValue es verdadero para los dos tipos anulables, entonces multiplico y devuelvo el resultado. Tengo algunas opciones para el valor de retorno si una o ambas propiedades son nulas:

  • Retorno 0
  • Lanzar una excepción
  • Devolver un número mágico (-1)
  • ¿Devolver decimal? (EDITAR - ver comentarios)

Pensé que una de mis opciones sería devolver NaN, pero veo que esto solo es posible para el tipo doble. ¿Por qué es esto?

Para el registro, devolver 0 tiene más sentido en este caso y eso es lo que planeo hacer a menos que alguien tenga una mejor sugerencia.


Los tipos integrales en .NET utilizan el sistema de complemento de dos para la representación. Si bien podían reservar algunos patrones de bits para valores especiales, optaron por no hacerlo. double y float utilizan un sistema de representación completamente diferente (IEEE 754) que reserva algunos patrones de bits especiales para NaN, + Infinito, -Infinito, ...

Una razón por la que los valores de NaN e Infinito tienen más sentido para la aritmética de punto flotante es que las operaciones podrían resultar en división por cero, no solo porque el divisor es en realidad cero, sino porque es demasiado pequeño para ser representado por el tipo. Como resultado, si ese no fuera el caso, podría tener algún cálculo válido que arroje misteriosamente una excepción de división por cero. Esto no sucederá con los tipos int ya que son exactos y no tienen un error de precisión.

decimal está diseñado para ser usado en números de coma flotante decimales del "mundo real". Rara vez está sujeto a los cálculos para los que double y float están diseñados para hacer. ¿Qué expresaría NaN para un número del mundo real?

Dejando las razones solo, es lo que es y no hay nada que podamos hacer al respecto, por lo que la mejor manera de hacerlo es utilizar tipos que admiten nulos (están diseñados para ayudar con exactamente este tipo de situaciones). Es la forma correcta de resolver este problema. Si no quieres hacer eso (y las excepciones no tienen sentido), debes recurrir a la solución del número mágico. Si elige hacerlo, asegúrese de que esté fuera del dominio de los resultados válidos.

EDITAR (error muy común sobre el decimal):

Como también señaló MSDN , el decimal no es un punto fijo. Es un número de punto flotante:

Un número decimal es un valor de punto flotante que consiste en un signo, un valor numérico donde cada dígito en el valor varía de 0 a 9, y un factor de escala que indica la posición de un punto decimal flotante que separa las partes integrales y fraccionarias del valor numérico.


Para resolver NAN e Infinity usa este

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