编程工具是VC2005,数据库是SQL 2008。数据库中有一个报警阈值表,现在该表中仅有一条数据:
      
   //读取报警阈值表以获取阈值
 _RecordsetPtr m_pRecordsetDoseLimit;
 m_pRecordsetDoseLimit.CreateInstance(_uuidof(Recordset));  CString strsqlDoseLimit=L"select * from 报警阈值";
 float limitvalue;//记录表中的阈值  try
 {
 m_pRecordsetDoseLimit=theApp.m_pConnection->Execute((_bstr_t)strsqlDoseLimit,NULL,adCmdText);
 }
 catch (_com_error e)
 {
 AfxMessageBox(e.Description());
 }  if(m_pRecordsetDoseLimit->ADOEOF)
 {
 AfxMessageBox(L"报警阈值表中没有相关的记录");
 return FALSE;
 }  limitvalue=(float)m_pRecordsetDoseLimit->GetCollect("阈值");奇怪的是:明明数据库中的阈值记录为:88.9,但我根据上面读取到的数值即limitvalue=88.899998。显然是读取精度问题。
有没有什么方法解决呢?

解决方案 »

  1.   

    数据库里的字段类型定义不要用double或者float,要用numeric 或者decimal,否则会遇到精度问题
      

  2.   


    数据库中的字段类型就是float类型。表格 14报警阈值(DoseLimit)中文名称 英文名称            取值类型       单位          描述
    阈值ID LimitID         uniqueidentifier        主键
    阈值名称 limitName varchar[100]
    阈值 limitValue float             nGy/h
    备注 limitNote varchar[Max]
      

  3.   

    把字段类型改成Decimal(32,2),保留两位小数。按照SQL Server对float的解释,只能保存近似数字,要保存准确小数。必须使用Decimal或者Numeric。
    所以数据库的误差问题,在SQL Server那一层就出现了,即便是保存88.9到数据库,数据库的float也只能保存为88.8999999.读取出来更是如此。此外使用decimal类型之后。得到这字段的数据并且显示  _variant_t var = m_pRecordsetDoseLimit->GetCollect("阈值");
      double dbVal = var.decVal.Lo64;
         
      dbVal *= (var.decVal.sign == 128)? -1 : 1;
       dbVal /= pow(10, var.decVal.scale);  
      CString strFormat;
       strFormat.Format("%d", var.decVal.scale);
       strFormat = "%."+strFormat+"f";
       strValue.Format(strFormat, dbVal );
      

  4.   


    但是数据库不是我建立的,我是读取服务器上的数据库。服务器中数据库的字段类型就是float类型的。所以,导致了读取时的误差。不过还是谢谢你的回复。