在写代码的过程中,遇到了一个问题:项目需要保存float类型的值到文件中,需要的时候,再加载进来,显示到界面上。这时候,问题出来了,12345.67转成CString时,得不到想要的字符串。程序如下:
float fval = 12345.67;
CString str;
str.Format(_T("%f"),fval);
猜猜看,str的值是什么?
str的值为12345.669922;
这时候测试人员说了,我明明输入的是12345.67,你的程序怎么给整成这么一坨了?你的程序有问题!
唉,有问题是常事,改呗。
可是接下来我郁闷了,怎么改也改不成12345.67。这时候应该有明白人说了,你一个float类型的,有效位数也就7位,后面的无所谓啦。其实我也和测试的说了,只是人家不相信,说我忽悠。
写个测试代码
//先反着试试,从字符串到float
CString str = _T("12345.67");
//求小数位数
int dp = str.ReverseFind('.') +1;
int length = str.GetLength() - dp;
//得到float,其实这时候得到的float也不太精准
两个函数得到的结果相同
float fval = _wtof(str);
//float fval2 = _tstof(str.GetBuffer());
int n = sizeof(double);
int n1 = sizeof(float);
float f1 = 0;
memcpy(&f1,&fval,4);
float f2 = f1;
double d3 = 0;
d3 = f1;
float f3 = 0;
f3 = d3;
CString str2;
CString strFormat = _T("%.");
CString strLength;
strLength.Format(_T("%df"),length);
strFormat += strLength;
//str2.Format(_T("%f"),f2);
str.Format(strFormat,f2);
CString strTest;
strTest.Format(_T("%g"),fval);
strTest.Format(_T("%lf"),fval);
//检查float的小数位数
//对于123.45类型的,能检查出2位小数
//对于123.45004类型的,也只能检查出两位
int decPos = 0;
int sign = 0;
float val = fval;
int i = 0;
ecvt(value,0,&decPos,&sign);
while ((val -(long)val) != 0)
{
val = val*10;
i++;
}
通过上面的代码可以看出来了,其实还是没解决实际问题。
对于此类问题,只能是在用户输入时,给予一定的限制,只保证几位小数位数,多了精度不保证,或者干脆就只能输入7个有效数字,多了给出提示。
要是严格按照用户输入多少,载入时再原样显示,我暂时做不到。
各位如有什么好的方法,一定要告诉我
附上网上搜出的一个用boot保证精度的方法,以下是链接:
http://www.cppblog.com/stonexin/archive/2011/03/31/143089.aspx