2014-03-25 63 views
0

給定浮點數7.64,將其轉換爲字符串而不使用任何內置函數/庫。 這個問題在java中很容易。由於+運算符重載的字符串。我們可以做浮點數到字符串轉換中的錯誤

class Float2String 
{ 
    public static void main(String[] args) 
    { 
     float f=7.64f; 
     String result; 
     result=""+f; 
     System.out.println(result); 
    } 
} 

但在C,我嘗試這樣做..

int main() 
{ 
    float f =2.44; 
    int i, j = 0; 
    i = (int) f; 

    f = f - i; 
    while(f > 0) { 
     f *= 10; 
     j = (j*10) + (int) f; 
     f = f - (int) f; 
    } 
    //now make itoa() to convert i and j to strings .  
    return 0; 
} 

這裏的問題是,浮點錯誤開始潛入如while循環去和j留下不正確的小數部分。 例如在上述情況下,f的值變化如 123

那麼如何在c或C++中執行此問題。

+0

請記住,即使是字符串+運營商正在使用一個內置的函數/庫(StringBuilder.append)1.0的區別,所以你原來的目標有點沒有意義。 –

+0

我在尋求另一種解決方案@KevinWorkman –

+0

呃,我明白了。我唯一的觀點是,你的聲明可能在不使用內置函數的情況下在Java中執行此操作是不正確的。 –

回答

1

突然跳轉到一個完全錯誤的值由j溢出其int引起的。你可以使用unsigned long

然而,Thel循環可能不會達到0,因爲浮點數只是2的(負)冪和的近似值。當乘以10後,這些和不會減小,然後減去整數部分。

最好的方法是獲得固定的數字位數,乘以10 n,然後斬斷尾隨零。

1

解決的辦法是用float支持的精度(=數位數)打印f。

int main() 
{ 
    float f =2.44; 
    int i, len; 
    char str[100]; 

    i = (int) f; 
    itoa(i, str, 10); 
    len = strlen(str); 
    str[len] = '.'; 

    f = f - i; 
    while(len <= 6) { 
     len++; 
     f *= 10; 
     str[len] = '0' + (int)f; 
     f = f - (int) f; 
    } 
    str[len + 1] = '\0'; 

    /* Remove trailing zeroes and decimal points. */ 
    for (;len > 0 && (str[len] == '0' || str[len] == '.'); --len) { 
     if (str[len] == '.') { 
      str[len] = '\0'; 
      break; 
     } 
     str[len] = '\0'; 
    } 
    printf("%s", str); 
    return 0; 
} 
+0

len ++應該在循環的頂部。 –

+0

字符串2.440000仍然給出錯誤,因爲它不等於字符串2.44。 –

+1

感謝您發現錯誤。更正了答案並添加了刪除尾部零。 –

0

除了指定小數位數,另一種計算浮點不準確度的十進制值的方法是使用在float.h中定義的FLT_EPSILON(或DBL_EPSILON)。

FLT_EPSILON是,最小浮點值大於1.0

#include<stdio.h> 
    #include<float.h> 
    int main() 
    { 
     float origf = 2.44; 
     float f = origf, newf = 0.0; 
     int i, j = 0; 
     int powerOfTen = 1; 
     i = (int) f; 
     f = f - i; 
     do 
     { 
      f *= 10; 
      powerOfTen *= 10; 
      j = j * 10 + (int)f; 
      f = f - (int) f; 

      newf = i + (float)j/ powerOfTen; 
     } while ((origf + FLT_EPSILON) > newf && newf > (origf - FLT_EPSILON)); 
     printf("%d %d\n", i, j); 
     return 0; 
    }