繁体   English   中英

浮点到字符串转换时出错

[英]Error in float to string conversion

给定一个浮点数7.64,使用任何内置函数/库将其转换为字符串WITHOUT。 这个问题在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;
}

这里的问题是浮点错误开始潜入,而循环进行,j留下不正确的小数部分。 例如,在上面的情况下,f的值变化如 123

那么如何在c或C ++中解决这个问题呢。

解决方案是以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;
}

突然跳转到完全错误的值是由于j溢出其int引起的。 你可以使用unsigned long

然而,由于事实,浮点数只是2的(负)幂之和的近似值,因此该循环可能不会达到0。当乘以10然后减去整数部分时,这些和不会减少。

最好的方法是使用固定的数字位数,乘以10 n然后斩波尾随零。

除了指定小数位数之外,考虑浮点不准确性的另一种计算小数值的方法是使用float.h定义的FLT_EPSILON (或DBL_EPSILON )。

FLT_EPSILON是1.0与大于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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM