Извлечь десятичную часть из числа с плавающей запятой в C

Как мы можем извлечь десятичную часть числа с плавающей запятой и сохранить десятичную часть и целочисленную часть в две отдельные целочисленные переменные?

Вы используете функцию modf :

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

Вы также можете использовать его для целого числа, но будьте осторожны, вы можете переполнить целое число. Тогда результат не предсказуем.

Попробуй это:

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

Для меня это производит:

 Num = 23.345000, intpart = 23, decpart = 0.345000 

Кажется, это то, о чем вы просите.

Быстрый «в ореховой скорлупе» наиболее очевидный ответ выглядит так:

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

Вы измените количество десятичных точек, которое вы хотите, изменив N_DECIMAL_POINTS_PRECISION в соответствии с вашими потребностями.

Я думаю, что использование строки – правильный способ пойти в этом случае, так как вы не знаете априори число цифр в десятичной части. Но это не будет работать для всех случаев (например, 1.005), как упоминалось ранее в @SingleNegationElimination. Вот мой пример:

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

Я создал подпрограмму с использованием double float, она возвращает 2 целых значения.

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

Вот еще один способ:

 #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

Вывод:

 whole: 123 mantissa: 4567 

Если вы просто хотите получить первое десятичное значение, решение действительно прост.

Вот пояснительный пример:

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

Скажем, например, мы имеем начальное значение с плавающей точкой 27.8.

  • Путем простого ввода начального значения float в int вы отбрасываете часть дроби и сохраняете только целую часть.
  • Путем умножения начального значения с плавающей запятой на 10 мы получаем результат 278.0, затем, выставив этот результат в int, вы получите значение 278
  • Если мы разделим 278 на 10, получаем 27,8, из которых остаток равен 8, что является значением в правой части десятичной точки. Таким образом, используйте модуль.

Затем этот метод можно использовать для получения следующих десятичных символов, используя, например, 100 вместо 10, и так далее.


Просто обратите внимание, что если вы используете эту технику в системах реального времени, например, чтобы отобразить ее на 7-сегментном дисплее, она может не работать должным образом, потому что мы умножаемся на значение float, где умножение занимает много времени накладных расходов.

Даже я думал, как это сделать. Но я нашел способ. Попробуйте этот код

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

Вывод:-

 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 

Возможно, лучшая идея – решить проблему, пока данные находятся в формате String. Если у вас есть данные как String, вы можете проанализировать его в соответствии с десятичной точкой. Вы извлекаете интегральную и десятичную часть в качестве подстроки, а затем преобразуете эти подстроки в действительные целые числа.

Я сделал эту функцию, она работает нормально:

 #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)); } в #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 
Interesting Posts
Давайте будем гением компьютера.