Comprobando si el flotante es un número entero

¿Cómo puedo verificar si una variable float contiene un valor entero? Hasta ahora, he estado usando:

 float f = 4.5886; if (f-(int)f == 0) printf("yes\n"); else printf("no\n"); 

Pero me pregunto si hay una solución mejor, o si esta tiene algún (o muchos) inconvenientes.

Además de las buenas respuestas ya dadas, también puedes usar ceilf(f) == f o floorf(f) == f . Ambas expresiones devuelven true si f es un entero. También devuelven false para NaN (los NaN siempre comparan desigual ) y true para ± infinito, y no tienen el problema de desbordar el tipo entero utilizado para mantener el resultado truncado, porque floorf() / ceilf() devuelve float .

Tenga en cuenta que la mayoría de las técnicas aquí son válidas suponiendo que el error de redondeo debido a cálculos previos no es un factor. Por ejemplo, podrías usar roundf , así:

 float z = 1.0f; if (roundf(z) == z) { printf("integer\n"); } else { printf("fraction\n"); } 

El problema con esta y otras técnicas similares (como ceilf , casting long , etc.) es que, si bien funcionan bien para constantes de números enteros, fallarán si el número es resultado de un cálculo que estaba sujeto a flotación- punto de redondeo de error. Por ejemplo:

 float z = powf(powf(3.0f, 0.05f), 20.0f); if (roundf(z) == z) { printf("integer\n"); } else { printf("fraction\n"); } 

Imprime “fracción”, aunque (3 1/20 ) 20 debería ser igual a 3, porque el resultado del cálculo final fue 2.9999992847442626953125 .

Cualquier método similar, ya sea fmodf o lo que sea, está sujeto a esto. En aplicaciones que realizan cálculos complejos o propensos al redondeo, generalmente lo que quiere hacer es definir algún valor de “tolerancia” para lo que constituye un “número entero” (esto se aplica a las comparaciones de igualdad de punto flotante en general). A menudo llamamos épsilon de tolerancia. Por ejemplo, digamos que perdonaremos a la computadora un error de redondeo de hasta +/- 0.00001. Entonces, si estamos probando z , podemos elegir un épsilon de 0.00001 y hacer:

 if (fabsf(roundf(z) - z) <= 0.00001f) { printf("integer\n"); } else { printf("fraction\n"); } 

En realidad, no desea usar ceilf porque, por ejemplo, ceilf(1.0000001) es 2 no 1, y ceilf(-1.99999999) es -1, no -2.

Puedes usar rintf en lugar de roundf si lo prefieres.

Elija un valor de tolerancia que sea apropiado para su aplicación (y sí, a veces la tolerancia cero es apropiada). Para obtener más información, consulte este artículo sobre la comparación de números de coma flotante .

stdlib float modf (float x, float * ipart) se divide en dos partes, comprueba si el valor de retorno (parte fraccionaria) == 0.

 if (fmod(f, 1) == 0.0) { ... } 

No te olvides de math.h y libm .

 if (f <= LONG_MIN || f >= LONG_MAX || f == (long)f) /* it's an integer */ 

No estoy 100% seguro, pero cuando lanzas f a un int, y lo restas de f, creo que está siendo devuelto a un float. Esto probablemente no importará en este caso, pero podría presentar problemas en el futuro si esperas que sea un int por alguna razón.

No sé si es una solución mejor per se, pero podría usar el módulo matemático en su lugar, por ejemplo: float f = 4.5886; bool isInt; isInt = (f % 1.0 != 0) ? false : true; float f = 4.5886; bool isInt; isInt = (f % 1.0 != 0) ? false : true; Dependiendo de tu comstackdor, puedes o no necesitar el .0 después del 1, de nuevo, todo lo implícito se pone en juego. En este código, bool isInt debe ser verdadero si el derecho del punto decimal es todo ceros, y falso de lo contrario.

 #define twop22 (0x1.0p+22) #define ABS(x) (fabs(x)) #define isFloatInteger(x) ((ABS(x) >= twop22) || (((ABS(x) + twop22) - twop22) == ABS(x))) 

Bueno, recientemente me encontré con este problema y sorprendentemente no encontré ninguna solución en Internet para esto. Así que aquí va mi solución. Por ejemplo, si el valor es 3.00 y solo necesitamos 3, entonces debemos verificar si después del “.” hay ceros o no. Si todo se puede convertir a int o si no, permanece flotante. Entonces incluye esta función

 int isInt(float val) { int i = (int) val; if( i != val) return 0; // its not an integer else return 1; // is an integer } int main() { float i = 3.9; // not this is an example. if(isInt()) printf("%d", i); else printf("%f", i); return 0; } 

¡Espero eso ayude!

http://anandkhinvasara.com/check-whether-number-integer-float-c/