一个函数long GetDataPrecision(double data),作用是返回data的小数点后面有效位数。如3.10200000,则应该返回3.102。具体实现如下:
long GetDataPrecision(double data)
{
CString szTemp;
szTemp.Format(_T("%g"),data);//use "%g" to remove the terminally string of zero of the data;
int nPos;
nPos = szTemp.Find('.');//get the point position
if(-1 == nPos)
{
return 0;
}
CString szPrecision;
szPrecision = szTemp.Left(szTemp.GetLength()-nPos);//get the decimal fraction part of the data
return szPrecision.GetLength() - 1;
}
这个函数主要是szTemp.Format(_T("%g"),data);这条语句有点意思。呵呵。为什么输出格式要写成%g呢,而不是%lf 呢?其中还是又点内涵的,两者的选择将导致这个函数实现的困难程度有所不同。既然我用了%g,那肯定是%g使得这个函数更易于实现撒。那它的作用到底是什 么呢?
假设data=23.3040000,通过szTemp.Format(_T("%g"),data);,则szTemp则为23.304。若 data=23.000,则为23。而通过szTemp.Format(_T("%lf"),data);打印的经过将是 23.304000...0,23.00...000。
看了上面的分析,然后想想这个函数的功能是取得double的小数部分的有效位,则%g是最佳选项了。因为通过%g相当与就完成了“去掉double数据 后面的零0”这个功能。若用%lf,则为了取得double的小数部分的有效位,必须将23.3040000的小数部分304000..00的后面的0去 掉,这个怎么实现呢,其实可以通过将304000..00逆序变成这个样子00...000403,这样便可以找到第一个非0的位置,然后再减下不就得出 double的小数部分的有效位了。呵呵。具体对这个字符串的相关操作都可以去MSDN中的CString中找到相关处理函数。
注意:这个我是在有mfc的环境下完成的,即用CString. 在其他环境下如string也可以完成的。
转载自:http://hi.baidu.com/zh_daniel/blog/item/afc67463207220610d33fa43.html