最近发生了一件有意思的事,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里定义的,如果需要,请包含此头文件。