2011-06-29 26 views
0

我试图存储十进制数字的所有数字。我决定使用modf为此目的。我的代码段是;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 
+4

[什么每台计算机科学家应该知道关于浮点运算(http://download.oracle.com/docs/cd/E19957-01/806-3568 /ncg_goldberg.html) – pmg

+0

[Wikipedia:Floating Point Number](http://en.wikipedia.org/wiki/Floating_point_number) –

回答

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. 
0

,让我知道为什么:scanf("%lf", &num1);

在这里,您已经将输入转换为双精度...所以您不会得到您正在尝试的“高精度扫描”,因为它在第一次转换中变得“丢失”。

如果你想要实际的十进制数,你应该在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 
+0

我想将所有十进制数字数到一个数组中(大小为20)。例如 8.127 myhigh .digit =“8”,“1”,“2”,“7” – mustafaSarialp

+1

所以你想简单地删除'.'并将所有数字存储在字符串中? –