通用函数提取没有Floor()的float的十进制部分

时间:2017-03-04 08:54:45

标签: c

我想将浮点数分成两个独立的部分作为真实和非真实部分。 例如:如果x = 45.678,则我的函数必须提供real= 45non_real=678。我尝试了以下逻辑。

split ( float x, unsigned int *real, unsigned int *non_real)
{
   *real = x;
   *non_real = ((int)(x*N_DECIMAL_POINTS_PRECISION)%N_DECIMAL_POINTS_PRECISION);
    printf ("Real = %d , Non_Real = %d\n", *real, *non_real);
}

其中N_DECIMAL_POINTS_PRECISION = 10000。它会给小数部分直到4位数,而不是之后。

它仅适用于特定的小数点精度集。代码不是通用的,它必须适用于所有浮动数字,例如9.56578445.6875322等等。所以,如果有人能帮助我,这将是非常有帮助的。

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用floor()查找整数部分,然后从原始值中减去整数部分以找到小数部分。

注意:您最有可能遇到的问题是某些数字太大而整数部分无法适应int的范围。

- 增加 -

当且仅当您能够假设unsigned int大于浮点表示的有效位数(例如32位unsigned int和IEEE标准单精度浮点数时只有23个小数位,其中&#34; 32 <23&#34;为真);那么unsigned int太大的数字就不能有任何小数位。这导致了一个类似的解决方案:

if(x > UINT_MAX) {
    integer_part = x;
    fractional_part = 0;
} else {
    integer_part = (int)x;
    fractional_part = x - integer_part;
}