double转CString

最近发生了一件有意思的事,MFC工程中有一个CEdit控件,控件绑定了一个double变量,当double变量的值变化时通过UpdateData可以直接展示到控件上。然后,有一个CListCtrl,需要将CEdit的值做展示。重点来了,当CEdit的值较小时,一切都很正常,当CEdit值比较大时或者精度很高时,两边的显示就不一致,CEdit显示的科学计数法且精度高,CListCtrl就差很多。

经过分析,发现问题出在double转CString上,原因是CListCtrl在设置Item Text时,必须要CString类型,因此进行了转换,而转换时就涉及精度问题。现将double转CString的代码贴出来,供大家参考:

/*************************************************
Function:DoubleToString
Description:double转CString
Calls:
Input:需要转换的double
Output:NULL
Return:CString
Others:DBL_DIG(15)为精度(f or e format)
参考资料:
https://docs.microsoft.com/en-us/previous-versions/f30dzcf6(v=vs.140)
https://docs.microsoft.com/en-us/previous-versions/56e442dc(v=vs.140)
https://docs.microsoft.com/en-us/previous-versions/hf4y5e3w(v=vs.140)
Data:2021年6月2日
*************************************************/
CString DoubleToString(double data)
{
    const int TEXT_BUFFER_SIZE = 400;
    TCHAR szBuffer[TEXT_BUFFER_SIZE] = {0};
    _sntprintf_s(szBuffer, _countof(szBuffer), _countof(szBuffer) - 1, _T("%.*g"), DBL_DIG, data);
    return szBuffer;
}

 

需要注意的是DBL_DIG是在C运行时float.h里定义的,如果需要,请包含此头文件。

上一篇:Oracle11g:重新编译


下一篇:ORACLE11g安装