Extrae la parte decimal de un número de punto flotante en C

¿Cómo podemos extraer la parte decimal de un número de coma flotante y almacenar la parte decimal y la parte entera en dos variables enteras separadas?

modf función modf :

 double integral; double fractional = modf(some_double, &integral); 

También puede convertirlo en un número entero, pero tenga en cuenta que puede desbordar el número entero. El resultado no es predecible entonces.

Prueba esto:

 int main() { double num = 23.345; int intpart = (int)num; double decpart = num - intpart; printf("Num = %f, intpart = %d, decpart = %f\n", num, intpart, decpart); } 

Para mí, produce:

 Num = 23.345000, intpart = 23, decpart = 0.345000 

Lo cual parece ser lo que estás pidiendo.

La respuesta más rápida de “en una shell de nuez” parece ser la siguiente:

 #define N_DECIMAL_POINTS_PRECISION (1000) // n = 3. Three decimal points. float f = 123.456; int integerPart = (int)f; int decimalPart = ((int)(f*N_DECIMAL_POINTS_PRECISION)%N_DECIMAL_POINTS_PRECISION); 

Cambiaría la cantidad de puntos decimales que desee cambiando la N_DECIMAL_POINTS_PRECISION para que se ajuste a sus necesidades.

Creo que usar el hilo es el camino correcto en este caso, ya que no se sabe a priori el número de dígitos en la parte decimal. Sin embargo, no funcionará para todos los casos (por ejemplo, 1.005), como se mencionó anteriormente por @SingleNegationElimination. Aquí está mi opinión sobre esto:

 #include  #include  int main(void) { char s_value[60], s_integral[60], s_fractional[60]; int i, found = 0, count = 1, integral, fractional; scanf("%s", s_value); for (i = 0; s_value[i] != '\0'; i++) { if (!found) { if (s_value[i] == '.') { found = 1; s_integral[i] = '\0'; continue; } s_integral[i] = s_value[i]; count++; } else s_fractional[i - count] = s_value[i]; } s_fractional[i - count] = '\0'; integral = atoi(s_integral); fractional = atoi(s_fractional); printf("value = %s, integral = %d, fractional = %d\n", s_value, integral, fractional); return 0; } 

Creé una subrutina usando un flotador doble, devuelve 2 valores enteros.

 void double2Ints(double f, int p, int *i, int *d) { // f = float, p=decimal precision, i=integer, d=decimal int li; int prec=1; for(int x=p;x>0;x--) { prec*=10; }; // same as power(10,p) li = (int) f; // get integer part *d = (int) ((f-li)*prec); // get decimal part *i = li; } void test() { double df = 3.14159265; int i,d; for(int p=2;p<9;p++) { double2Ints(df, p, &i,&d); printf("d2i (%d) %f = %d.%d\r\n",p, df,i,d); } }
void double2Ints(double f, int p, int *i, int *d) { // f = float, p=decimal precision, i=integer, d=decimal int li; int prec=1; for(int x=p;x>0;x--) { prec*=10; }; // same as power(10,p) li = (int) f; // get integer part *d = (int) ((f-li)*prec); // get decimal part *i = li; } void test() { double df = 3.14159265; int i,d; for(int p=2;p<9;p++) { double2Ints(df, p, &i,&d); printf("d2i (%d) %f = %d.%d\r\n",p, df,i,d); } } 

Aquí hay otra manera:

 #include  int main() { char* inStr = "123.4567"; //the number we want to convert char* endptr; //unused char ptr for strtod char* loc = strchr(inStr, '.'); long mantissa = strtod(loc+1, endptr); long whole = strtod(inStr, endptr); printf("whole: %d \n", whole); //whole number portion printf("mantissa: %d", mantissa); //decimal portion } 

http://codepad.org/jyHoBALU

Salida:

 whole: 123 mantissa: 4567 

Si solo quiere obtener el primer valor decimal, la solución es realmente simple.

Aquí hay un ejemplo explicativo:

 int leftSideOfDecimalPoint = (int) initialFloatValue; // The cast from float to int keeps only the integer part int temp = (int) initialFloatValue * 10; int rightSideOfDecimalPoint = temp % 10; 

Digamos, por ejemplo, que tenemos un valor flotante inicial de 27.8.

  • Simplemente lanzando el valor flotante inicial a un int, descarta la parte fracción y solo conserva la parte entera.
  • Al multiplicar el valor de flotación inicial por 10 obtenemos un resultado de 278.0, luego al convertir este resultado en int, le da el valor de 278
  • Si dividimos 278 entre 10, obtenemos 27.8, de los cuales el rest es 8, que es el valor en el lado derecho del punto decimal. Por lo tanto, use el módulo.

Esta técnica se puede usar para obtener los siguientes caracteres decimales utilizando, por ejemplo, 100 en lugar de 10, y así sucesivamente.


Solo tenga en cuenta que si utiliza esta técnica en sistemas en tiempo real, por ejemplo para mostrarla en una pantalla de 7 segmentos, es posible que no funcione correctamente porque estamos multiplicando con un valor flotante, donde la multiplicación requiere mucho tiempo.

Incluso yo estaba pensando cómo hacerlo. Pero encontré una manera. Prueba este código

 printf("Enter a floating number"); scanf("%d%c%d", &no, &dot, &dec); printf("Number=%d Decimal part=%d", no, dec); 

Salida:-

 Enter a floating number 23.13 Number=23 Decimal part=13 
  #include  Int main () { float f=56.75; int a=(int)f; int result=(fa)*100; printf ("integer = %d\n decimal part to integer =%d\n",result); } Output:- integer =56 decimal part to integer = 75 

Quizás la mejor idea es resolver el problema mientras los datos están en formato de cadena. Si tiene los datos como Cadena, puede analizarlos de acuerdo con el punto decimal. Extrae la parte integral y decimal como subcadenas y luego convierte estas subcadenas en enteros reales.

Hice esta función, parece funcionar bien:

 #include  void GetFloattoInt (double fnum, long precision, long *pe, long *pd) { long pe_sign; long intpart; float decpart; if(fnum>=0) { pe_sign=1; } else { pe_sign=-1; } intpart=(long)fnum; decpart=fnum-intpart; *pe=intpart; *pd=(((long)(decpart*pe_sign*pow(10,precision)))%(long)pow(10,precision)); } 
 cout<<"enter a decimal number\n"; cin>>str; for(i=0;i