本帖最后由 kingsollyu 于 2011-07-12 18:19:20 编辑

解决方案 »

  1.   

    你这个叫做BCD码,搜一下吧,应该有相应的库
      

  2.   

    可是我有小数啊。
    刚才在网上找到了一段
    int   ConvertBCD(int   dnum) 
     { 
     int   bcdval=0; 
     if(   dnum> 9999   ||   dnum   <   0     )   return   -1; 
     bcdval   =   (   (   (dnum/1000)*16+(dnum%1000)/100)*16+(dnum%100)/10   )*16   +dnum%10; 
     return   bcdval; 
     }
      

  3.   

    晕哦
    百度百科上都有BCD码,上面还有算法描述
    http://baike.baidu.com/view/45179.htm你带小数也不怕,分为2部分不就可以了吗
      

  4.   

    你给个小数部分的啊,我写不出来。
    1005.01  这个01取消出来,取出来的是1前面少了一个0
    int ConvertBCD(int dnum) 

    int bcdval=0; 
    if( dnum> 9999 || dnum < 0   ) return -1; 
    bcdval = ( ( (dnum/1000)*16+(dnum%1000)/100)*16+(dnum%100)/10 )*16 +dnum%10; 
    return bcdval; 
    }void CDsafDlg::OnButton1() 
    { CString str; double d = 1005.01;
    int nNow=int(d);
    double dNow=d-nNow; 
      for (int sd=1;sd<=2;sd++)
    dNow *= 10; str.Format("%d,%d",ConvertBCD(nNow),ConvertBCD(dNow));
    MessageBox(str);
    }
      

  5.   

    压缩bcd码,不过俺脚着,要不文本方式,要不二进制方式。
      

  6.   

    自己给解决了,下面贴一点代码让后来的人有个参考
    char * a = new char ; //要写入到文件的字符串

    //取得整数部分
    int nNo = (int)nNowValue;
    //取得小数部分 +0.00001是为了解决转换不稳定
    double dDot=nNowValue-nNo+0.00001;

    //这里只取4位整数和4位小数
    //事例:10005.01
    int nNoH = nNo / 100; //取1005.01的10
    int nNoL = nNo % 100; //取1005.01的05 这里取出来的只有5放心,后面可以解决
    int dDotH = dDot * 100; //取1005.01的01 这里同样取出来的只有1,不是01,放心,后面可以解决
    int dDotL = dDot * 10000 - dDotH * 100; //取1005.01中01后面的00
    a[0]=2;//小数点的位数
    a[1]=nNoH;
    a[2]=nNoL;
    a[3]=dDotH;
    a[4]=dDotL;这样就可以了。最后在解码的时候
    CFileDialog fDlg(TRUE,"txt","a",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt文件(*.txt)|*.txt|全部文件(*.*)|*.*||");
    if (fDlg.DoModal() != IDOK) return;
    //读取文件内存变量
    CFile fFile(fDlg.GetPathName(),CFile::modeRead|CFile::typeBinary);
    //读取到文本文件的内存变量
    char * szBuff = new char[fFile.GetLength()];
    //开始读取文本文件
    fFile.Read(szBuff,fFile.GetLength());
    CString str,strTemp; //////////////////////////////////////////////////////////////////////////
    // 计算Y值 开始 //取到保留小数点的位数
    strTemp.Format("%d",szBuff[0]);
    //将取到的字符串转换成整数
    int nDotPos = atoi(strTemp);
    //将全部Y值取出,此处没有小数点位置
    strTemp.Format("%02d%02d%02d%02d",szBuff[1],szBuff[2],szBuff[3],szBuff[4]);
    //将取出的Y值从字符串转换为整数,来用转换为小数,
    //+0.00001解决转换小数位太长,Y值失真问题
    int nYValue = atoi(strTemp) + 0.00001;
    //将无小数点的Y值转换为小数
    double dYVlaue = nYValue * 0.0001; //用来格式化字符串的格式字符串
    char strFormat[10];
    //将strFormat格式化为"%.2f"其中2为保留的小数位
    sprintf(strFormat,"%%.%df",nDotPos);
    strTemp.Format(strFormat,dYVlaue);
    //添加到列表中
    m_list.SetItemText(nSum,2,strTemp); // 计算Y值 结束
    //////////////////////////////////////////////////////////////////////////好了,结贴了。