由float类型转CString类型引出的问题及分析

在写代码的过程中,遇到了一个问题:项目需要保存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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值