2011-06-29 55 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

所以你想簡單地刪除'.'並將所有數字存儲在字符串中? –