|
|
举个例子,比如:
我要把“123.456”字符串转换成数值正好等于123.456的float 或double 的值,该怎么转化?结果不能是123.4599,123.456001等!
转换方法函数:
CString str = _T("123.456");
DOUBLE dNumber = atof(str);
int iBase = 1;
int i = str.Find(_T("."));
for (int j = 0; j < i ; j ++) iBase* =10;
DOUBLE dTemp1,dTemp2;
dTemp1 = fmod(dNumber,10.0);
dTemp2 = dNumber - dTemp1;
DWORD i = (DWORD)(dTemp1 * iBase + 0.5 );
dTemp2 += i / (1.0 * iBase );
而我们有的时候经常用到的方法:
CString str = _T("123.456");
float fnum = 0;
fnum = atof(str);
是不可以的,因为浮点数本身就不是精确的,如果用数轴来表示浮点数的话,整个数轴上的浮点数是不连续的,所以,并不是每个数值都能有一个浮点数来精确的标示出来。一般来说,越接近原点,浮点数的分布越密集,数值就越精确。
相反:
给你一个 float a = 123.456,怎么将它转换成字符串“123.456”?
方法:
这里将上面的代码稍微修改一下:
首先写一函数:
DOUBLE FormatDouble(DOUBLE dNumber,int iBase)
{
if (iBase <= 0) return dNumber;
DOUBLE dTemp1,dTemp2;
dTemp1 = fmod(dNumber,10.0);
dTemp2 = dNumber - dTemp1;
DWORD i = (DWORD)(dTemp1 * iBase + 0.5 );
dTemp2 += i / (1.0 * iBase );
return dTemp2;
}
原来的转换:
CString str = _T("123.456");
DOUBLE dNumber = atof(str);
int iBase = 1;
int i = str.Find(_T("."));
for (int j = 0; j < str.GetLength() - i ; j ++) iBase* =10;
dNumber = FormatDouble(dNumber,iBase);
后来的转换即在转换成字符串之前也用上述函数整理一下。
|
|