在VC中,如果使用CString的Format函数将浮点数转换为对应的字符串,难免会遇到转换后的字符串不精确的问题。
比如:
float f = 3000.9;
CString strF;
strF.Format("%f", f);此时strF的值不是"3000.9",自己变成了"3000.89999999"。这对我很是困扰,为此我还将Boost类库引入了程序,暂时解决了这个问题。但是,Boost库也太大了,我的程序用Boost未免大材小用。而且还导致程序多编译了一些运行时库,程序的大小也膨胀的太多。所以还是不满意。不知道大家有没有什么简单的方法?多谢。

解决方案 »

  1.   

    CString strF;
    strF.Format("%.1f", f);//保留一位
      

  2.   

    char buf[20];
    Sprintf(buf, "%f", f);
      

  3.   

    首先你就不应该用float,这类精度比较高的东东的话,你用该用double,double就没问题了,你的转化精度不是问题,问题在于strF.Format("%f", f);中f隐式转化成double的过程
      

  4.   

    楼上解释的太好了!!就是这个道理!!
    float被隐式转化成double了
      

  5.   

    也就是说float a=3000.9;double b=a;//在b=a这个转化中丢失了精度。基本所有的API都是double参数的,所以你如果使用float,出现问题是普遍的,解决问题之道一是使用double,而是自己找到参数是float的转化函数case 'f':
    {
    double f;
    LPTSTR pszTemp; // 312 == strlen("-1+(309 zeroes).")
    // 309 zeroes == max precision of a double
    // 6 == adjustment in case precision is not specified,
    //   which means that the precision defaults to 6
    pszTemp = (LPTSTR)_alloca(max(nWidth, 312+nPrecision+6)); f = va_arg(argList, double);
    _stprintf( pszTemp, _T( "%*.*f" ), nWidth, nPrecision+6, f );
    nItemLen = _tcslen(pszTemp);
    }
    break;
      

  6.   

    上面是CString::FormatV的一些源代码,f = va_arg(argList, double);可见他把float转化成了double。
      

  7.   

    转换时利用%n.mf的格式进行格式化,n为总位数,m为小数的位数
    或者用double的形式.str.Format("%5.1f",n);
      

  8.   

    关键是程序要下载到其他硬件中,而那个硬件是16位的,只有float才能用。这个导致我在PC中的上位机程序很麻烦。
      

  9.   

    (接上)用这个函数就可以了#include "stdio.h"
    #include "string.h"
    main()
    {
    int a=100,b=400,i,res,n=8;
        char str[100];
    char ss[10]; str[0]='\0';
    res=a/b;
    sprintf(ss,"%d.",res); strcat(str,ss); for(i=0;i<n-1;i++)
    {
    a=(a%b)*10;
    res=a/b; sprintf(ss,"%d",res);
    strcat(str,ss);
    }
        
    a=(a%b)*10;
        res=a/b; a=(a%b)*10; int res1=a/b;    if(res1>=5)
    res++; sprintf(ss,"%d",res);
    strcat(str,ss); printf("%s",str);
        return 0;
    }
      

  10.   

    float占用四个字节啊!如果像你说的,硬件是16位不能用double的话,那么在硬件上面的CString::Format的参数也是float而不是double?所以我想应该不存在这种精度问题
      

  11.   

    关键是,我从硬件读到的数据是浮点数,float型,我在Debug的时候看的很清楚,数据是正确的。但是,要想显示到界面上,难免要把float数转换为字符串,这下就糟糕了。如上所说,VC先把float转换为double,从而造成了精确度失真,难道就没有办法解决了吗?
    Java中有专门的十进制数类,C++语言就不能有类似的东东么?另外:
    bluebohe(薄荷),与我的PC通讯的硬件是16位,但是我的PC还是32位啊。
      

  12.   

    照楼上说的,确定保留小数点后几位,在Format的%f中指定,比如%0.3f
      

  13.   

    float f = 3000.9;
    CString strF;
    strF.Format("%f", f);还是要知道小数点后边的位数,然后用format来格式化PC通讯的硬件是16位,但是我的PC还是32位啊??
    16位到pc上时只不过多了16位,高位都为0x0000啊,但表示出来的结果都是一样的.
      

  14.   

    同意以上说法。
    不知道你转换成CString下一步要干什么?在给你个建议:用char[],atof可以直接就转换了,不用考虑那么多精度问题。