在VC中,如果使用CString的Format函数将浮点数转换为对应的字符串,难免会遇到转换后的字符串不精确的问题。
比如:
float f = 3000.9;
CString strF;
strF.Format("%f", f);此时strF的值不是"3000.9",自己变成了"3000.89999999"。这对我很是困扰,为此我还将Boost类库引入了程序,暂时解决了这个问题。但是,Boost库也太大了,我的程序用Boost未免大材小用。而且还导致程序多编译了一些运行时库,程序的大小也膨胀的太多。所以还是不满意。不知道大家有没有什么简单的方法?多谢。
比如:
float f = 3000.9;
CString strF;
strF.Format("%f", f);此时strF的值不是"3000.9",自己变成了"3000.89999999"。这对我很是困扰,为此我还将Boost类库引入了程序,暂时解决了这个问题。但是,Boost库也太大了,我的程序用Boost未免大材小用。而且还导致程序多编译了一些运行时库,程序的大小也膨胀的太多。所以还是不满意。不知道大家有没有什么简单的方法?多谢。
strF.Format("%.1f", f);//保留一位
Sprintf(buf, "%f", f);
float被隐式转化成double了
{
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;
或者用double的形式.str.Format("%5.1f",n);
#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;
}
Java中有专门的十进制数类,C++语言就不能有类似的东东么?另外:
bluebohe(薄荷),与我的PC通讯的硬件是16位,但是我的PC还是32位啊。
CString strF;
strF.Format("%f", f);还是要知道小数点后边的位数,然后用format来格式化PC通讯的硬件是16位,但是我的PC还是32位啊??
16位到pc上时只不过多了16位,高位都为0x0000啊,但表示出来的结果都是一样的.
不知道你转换成CString下一步要干什么?在给你个建议:用char[],atof可以直接就转换了,不用考虑那么多精度问题。