编程工具是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。显然是读取精度问题。
有没有什么方法解决呢?
//读取报警阈值表以获取阈值
_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。显然是读取精度问题。
有没有什么方法解决呢?
数据库中的字段类型就是float类型。表格 14报警阈值(DoseLimit)中文名称 英文名称 取值类型 单位 描述
阈值ID LimitID uniqueidentifier 主键
阈值名称 limitName varchar[100]
阈值 limitValue float nGy/h
备注 limitNote varchar[Max]
所以数据库的误差问题,在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 );
但是数据库不是我建立的,我是读取服务器上的数据库。服务器中数据库的字段类型就是float类型的。所以,导致了读取时的误差。不过还是谢谢你的回复。