separar saber que punto pseint parte online numero flotante extraer entero entera devolver determinar como c floating-point decimal numbers

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



punto flotante a decimal online (12)

¿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?


Aquí hay otra manera:

#include <stdlib.h> 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


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); } }


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 <stdio.h> #include <stdlib.h> 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; }


Hice esta función, parece funcionar bien:

#include <math.h> 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)); }


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


La respuesta más rápida de "en una cáscara 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.


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.


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.


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 resto 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.


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.


#include <stdio.h> Int main () { float f=56.75; int a=(int)f; int result=(f-a)*100; printf ("integer = %d/n decimal part to integer =%d/n",result); } Output:- integer =56 decimal part to integer = 75


cout<<"enter a decimal number/n"; cin>>str; for(i=0;i<str.size();i++) { if(str[i]==''.'') break; } for(j=i+1;j<str.size();j++) { cout<<str[j]; }