我们如何提取浮点数的小数部分,并将小数部分和整数部分存储到两个不同的整数变量中?
我们如何提取浮点数的小数部分,并将小数部分和整数部分存储到两个不同的整数变量中?
你使用了modf
函数:
double integral;
double fractional = modf(some_double, &integral);
你也可以将其转换为整数,但请注意可能会造成整数溢出。这时结果是不可预测的。
double modf(double x, double *iptr);
,但我有一些编译器实现头文件使用float而不是double。也许这就是为什么截断到float可能会发生的原因...我想我会更喜欢使用int强制转换和减法解决方案来避免这个问题... - hbobenicio试试这个:
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
这似乎就是您所询问的内容。
num = 1.1
进行快速示例。作为浮点数,decpart
无法表示 0.1
。 - 0b101010最快、最明显的答案是:
#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
来修改您需要的小数点位数。
#define BIT_MASK1 /* 不确定 */
#define SHIFT /* 不确定 */
#define BIT_MASK2 /* 不确定 */
float f = 123.456;
uint32_t * tmp = (uint32_t *)&f;
int integerPart = (int)f;
- Trevor Boyd Smith
void double2Ints(double f, int p, int *i, int *d)
{
// f = 浮点数, p=小数位数, i=整数部分, d=小数部分
int li;
int prec=1;
for(int x=p;x>0;x--)
{
prec*=10;
}; // 相当于power(10,p)
li = (int) f; // 获取整数部分
*d = (int) ((f-li)*prec); // 获取小数部分
*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);
}
}
double fractional = some_double - floor(some_double);
此外,对于负值,此代码给出浮点数的正分数部分,因为floor()计算不大于输入值的最大整数值。
#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
}
输出:
whole: 123
mantissa: 4567
我认为在这种情况下使用字符串是正确的方法,因为你不知道小数部分的位数。但是,它并不适用于所有情况(例如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;
}
float num;
int intgPart;
float fracPart;
printf("Enter the positive floating point number: ");
scanf("%f", &num);
intgPart = (int)num;
fracPart = num - intgPart;
我的printf()不支持浮点数格式化。这是我将其作为两个整数打印的解决方案。将100更改为您喜欢的数字以增加精度。
我找到了这个
#define DEC(f) (uint32_t)(100*((f)-(float)((uint32_t)(f))))
#define INT(f) (uint32_t)(f)
DEC(3.1416..) = 14 (int)
INT(3.1416..) = 3 (int)
请告诉我您对这个解决方案的看法。
#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