modf函数无法正常工作

时间:2011-06-29 13:13:28

标签: c

我正在尝试存储十进制数字的所有数字。我已决定使用 modf 来实现此目的。我的代码段是;

struct high_precision scan_high(int *j)
{
    int i,a;
    struct high_precision mynum;
    double num1, fracpart, intpart;
    printf("Enter the values> ");
    scanf("%lf", &num1);
    if( num1 < 0 )
        mynum.sign = -1;
    else
        mynum.sign = 1;
    num1 = fabs(num1);
    fracpart = modf(num1, &intpart);
    if ( intpart > 0 && intpart < 10 )
        a = 1;
    while( intpart == 0 ) {
        fracpart *= 10;
        fracpart = modf(fracpart, &intpart);
        a -= 1;
    }
    for(i=0;fracpart > 0 && intpart != 0;i++){
        if( intpart > 0 ){
            mynum.digits[i] = intpart;
        }
        fracpart *= 10;
        fracpart = modf(fracpart, &intpart);
    }
    *j = i;
    mynum.decpt = a;

    return(mynum);
}

但不知怎的,它根本无法正常工作。例如;

Enter the values> 0.009876
    0.876000 9.000000
    0.760000 8.000000
    0.600000 7.000000

它必须停在这条线上。但是,它仍在继续计算;

1.000000 5.000000
1.000000 9.000000
1.000000 9.000000
1.000000 9.000000
1.000000 9.000000
1.000000 9.000000
0.999998 9.000000
0.999977 9.000000
0.999767 9.000000
0.997669 9.000000
0.976694 9.000000
0.766942 9.000000
0.669420 7.000000
0.694198 6.000000
0.941983 6.000000
0.419827 9.000000
0.198267 4.000000
0.982671 1.000000
0.826707 9.000000
0.267069 8.000000
0.000000 2.000000
0.000000 0.000000

2 个答案:

答案 0 :(得分:0)

这是因为没有准确存储浮点数(例如,不能完全表示)。以下是您可以用来说明这一点的示例:

#include <stdio.h>

int main() {
  double x = 0.009876;
  printf("%.20lf\n",x);
  return 0;
}

---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
0.00987599999999999940

> Terminated with exit code 0.

答案 1 :(得分:0)

我认为你没有正确地做事,让我告诉你原因:scanf("%lf", &num1);

在这里,您已经将输入转换为double ...因此您不会尝试这种“高精度扫描”,因为它在第一次转换时会“丢失”。

如果你想要实际的十进制数,你应该在ascii字符串中找到.并将其转换为和那里的int。

编辑我编写了一个小程序,这是你想到的吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int split_decimal(const char * in, int * intpart, unsigned int * decimals) {

    char * dot = strchr(in, '.');

    if (!dot) {
        *intpart = atoi(in);
        *decimals = 0;
        return 0;
    }

    *decimals = atoi(dot+1);
    *intpart = atoi(in);

    return 0;
}

int main(int argc, char ** argv) {

    int intpart;
    unsigned int decimals;

    split_decimal("-1.337", &intpart, &decimals);
    printf("%d.%d\n", intpart, decimals);
    split_decimal("50", &intpart, &decimals);
    printf("%d.%d\n", intpart, decimals);

    return 0;
}

输出:

-1.337
50.0