Извлечение десятичной части из числа с плавающей запятой в C - PullRequest
41 голосов
/ 01 февраля 2009

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

Ответы [ 14 ]

81 голосов
/ 01 февраля 2009

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

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

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

42 голосов
/ 01 февраля 2009

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

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

Похоже, это то, что вы просите.

13 голосов
/ 26 марта 2009

Самый быстрый ответ "в скорлупе ореха" выглядит так:

#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 в соответствии с вашими потребностями.

3 голосов
/ 20 декабря 2015

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

#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;
}
1 голос
/ 23 декабря 2017

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

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
1 голос
/ 26 марта 2009

Я создал подпрограмму с использованием двойного числа с плавающей запятой, он возвращает 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);
  }
}

0 голосов
/ 08 апреля 2019

Используйте плавающее число, чтобы вычесть значение floor ed, чтобы получить его дробную часть:

double fractional = some_double - floor(some_double);

Это предотвращает приведение типов к целому числу, что может вызвать переполнение , если число с плавающей запятой очень велико, и целочисленное значение даже не может его содержать.

Также для отрицательных значений этот код дает вам положительную дробную часть с плавающей точкой, поскольку floor () вычисляет наибольшее целочисленное значение не больше входного значения .

0 голосов
/ 16 октября 2018

Предположим, что A является вашим целым числом, тогда (int) A означает приведение числа к целому числу и будет целой частью, а другое - (A - (int) A) * 10 ^ n, здесь n - число сохранить десятичные дроби.

0 голосов
/ 19 марта 2018
 #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
0 голосов
/ 14 февраля 2017
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];
}
...