60

我们如何提取浮点数的小数部分并将小数部分和整数部分存储到两个单独的整数变量中?

4

15 回答 15

100

您使用以下modf功能:

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

您也可以将其转换为整数,但请注意您可能会溢出整数。那时的结果是不可预测的。

于 2009-02-01T00:56:55.397 回答
62

尝试这个:

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

这似乎是你所要求的。

于 2009-02-01T00:57:03.523 回答
15

快速“简而言之”最明显的答案似乎是:

#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以满足您的需要。

于 2009-03-26T03:53:35.623 回答
2

我使用双浮点创建了一个子程序,它返回 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);
  }
}

于 2009-03-25T23:33:54.950 回答
2

使用浮点数减去floor ed 值得到它的小数部分:

double fractional = some_double - floor(some_double);

这可以防止类型转换为整数,如果浮点数非常大以至于整数值甚至不能包含它,这可能会导致溢出。

同样对于负值,此代码为您提供浮点数的正小数部分,因为floor() 计算不大于输入值的最大整数值

于 2019-04-08T04:13:06.203 回答
2

我认为在这种情况下使用字符串是正确的方法,因为您事先不知道小数部分的位数。但是,正如@SingleNegationElimination 之前提到的,它不适用于所有情况(例如1.005)。这是我对此的看法:

#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;
}
于 2015-12-20T19:44:58.750 回答
1

这是另一种方式:

#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

输出:

whole: 123 
mantissa: 4567
于 2014-11-27T05:47:01.473 回答
1
float num;
int intgPart;
float fracPart;
printf("Enter the positive floating point number: ");
scanf("%f", &num);

intgPart = (int)num;
fracPart = num - intgPart;

小数部分可以通过从原始 double 值中减去整数部分来获得。

于 2021-04-13T07:01:33.757 回答
0

我做了这个功能,它似乎工作正常:

#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));
}
于 2013-09-26T16:37:15.980 回答
0

也许最好的办法是在数据为字符串格式时解决问题。如果你的数据是String,你可以根据小数点来解析。您将整数和小数部分提取为子字符串,然后将这些子字符串转换为实际整数。

于 2011-07-08T00:14:57.330 回答
0

如果只想获取第一个十进制值,解决方法真的很简单。

这是一个解释性示例:

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 。

  • 通过将初始浮点值转换为 int,您可以丢弃小数部分并仅保留整数部分。
  • 通过将初始浮点值乘以 10,我们得到 278.0 的结果,然后通过将此结果转换为 int,得到 278 的值
  • 如果我们将 278 除以 10,我们得到 27.8,余数为 8,即小数点右侧的值。因此使用模数。

然后可以使用此技术获取以下十进制字符,例如使用 100 而不是 10,依此类推。


请注意,如果您在实时系统上使用此技术,例如在 7 段显示器上显示它,它可能无法正常工作,因为我们正在与浮点值相乘,其中乘法需要大量开销时间。

于 2016-11-03T12:10:07.100 回答
0

连我自己都在想怎么办。但我找到了办法。试试这个代码

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
于 2017-12-23T10:04:38.903 回答
0
 #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
于 2018-03-19T12:32:02.357 回答
0

假设 A 是你的整数,那么 (int)A,表示将数字转换为整数,将是整数部分,另一个是 (A - (int)A)*10^n,这里 n 是要保留的小数位数.

于 2018-10-15T22:54:12.850 回答
-2
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];
}
于 2017-02-14T14:02:45.213 回答