2014-03-25 32 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; 
    }