¿Cómo puedo saber si un valor decimal o doble es un entero?
Por ejemplo:
decimal d = 5.0; // Would be true
decimal f = 5.5; // Would be false
o
double d = 5.0; // Would be true
double f = 5.5; // Would be false
La razón por la que me gustaría saber esto es para poder determinar mediante programación si deseo generar el valor usando .ToString("N0")
o .ToString("N2")
. Si no hay un valor de punto decimal, entonces no quiero mostrar eso.
Math.Abs(d-(int)d) < double.Epsilon
. Como si todos hubiéramos aprendido en la primera semana de nuestra primera clase de programación en la universidad.(int)d
es un desastre que arrojará una excepción para la mayoría de los valores dobles.Hay muchas maneras de hacer esto. Por ejemplo:
También puedes usar el módulo.
fuente
Math.Abs(d-(int)d) < double.Epsilon
es más seguro qued == (int)d
¿Qué tal esto?
El mismo código para
decimal
.Mark Byers hizo un buen punto, en realidad: esto puede no ser lo que realmente quieres. Si lo que realmente le importa es si un número redondeado a los dos decimales más cercanos es un número entero , puede hacer esto en su lugar:
fuente
Si bien las soluciones propuestas parecen funcionar para ejemplos simples, hacer esto en general es una mala idea. Es posible que un número no sea exactamente un entero, pero cuando intenta formatearlo, está lo suficientemente cerca de un entero que obtiene
1.000000
. Esto puede suceder si hace un cálculo que en teoría debería dar exactamente 1, pero en la práctica da un número muy cercano pero no exactamente igual a uno debido a errores de redondeo.En su lugar, formatee primero y si su cadena termina en un punto seguido de ceros, luego quítelos. También hay algunos formatos que puede usar que eliminan los ceros finales automáticamente. Esto podría ser lo suficientemente bueno para su propósito.
Salida:
fuente
Problemo solvo.
Editar: Pwned por Mark Rushakoff.
fuente
return ceil(num) == num && floor(num) == num;
return ceil(num) == floor(num);
La respuesta de Mark Rushakoff puede ser más simple, pero lo siguiente también funciona y puede ser más eficiente ya que no existe una operación de división implícita:
y
Si desea una sola expresión para ambos tipos, quizás
fuente
Si el límite superior e inferior de las
Int32
materias:fuente
fuente
Puede usar el formato de cadena para el tipo doble. Aquí hay un ejemplo:
Avísame si esto no ayuda.
fuente
fuente
Me enfrenté a una situación similar, pero donde el valor es una cadena. El usuario escribe un valor que se supone que es una cantidad en dólares, por lo que quiero validar que sea numérico y tenga como máximo dos decimales.
Aquí está mi código para devolver verdadero si la cadena "s" representa un número con un máximo de dos decimales y falso en caso contrario. Evita cualquier problema que resulte de la imprecisión de los valores de coma flotante.
Discuto esto con más detalle en http://progblog10.blogspot.com/2011/04/determining-whether-numeric-value-has.html .
fuente
El uso de Int. TryParse arrojará estos resultados:
fuente
Quizás no sea la solución más elegante, ¡pero funciona si no eres demasiado exigente!
fuente
Podrías usar el método 'TryParse'.
Esto verifica si el valor se puede convertir a un valor entero de número entero. El resultado puede indicar una bandera que se puede utilizar en cualquier otro lugar de su código.
fuente
yourDouble.toString("G17")
Prueba esto:
fuente