怎么去掉double后面的零0及取得double的小数部分的有效位

这两天在vs2005环境下做个项目(至于什么项目在此不便多说),碰到了怎么去掉double数据后面的零0及取得double的小数部分的有效 位的小问题(因为项目中的有个功能的需要)。问题虽小,但我想还是有必要在此说两句,一来是加强下记忆,二来方便下碰到此类问题的朋友们。

一个函数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

你可能感兴趣的:(怎么去掉double后面的零0及取得double的小数部分的有效位)