使用Qt的tr("%1").arg(...)转换double到QString会出错,起初以为是内存越界,但是后来用sprintf转换的结果跟它的结果比较,据此判断应该是Qt的Bug。
有没有朋友也遇到这样的情况呢? 我的开发环境为vs2005 + Qt-vs-addin,使用Qt4.5.2 和Qt4.8.4都有这样的问题。
代码片段:
char buffer[100] = {0};
QString qsTurnoverVol;
qsTurnoverVol = tr("%1").arg(price.TurnoverVol, 0, 'f', 0);
sData += tr("%1,").arg(qsTurnoverVol);
//test bug
{
sprintf(buffer, "%.0f", price.TurnoverVol);
QString sBuffer(buffer);
if (qsTurnoverVol != sBuffer)
{
QString sInfo = QString("'%1' vs '%2'").arg(qsTurnoverVol).arg(sBuffer);
static int times = 5;
if (times-- > 0)
MessageBox(0, sInfo.toStdWString().c_str(), TEXT("出错啦"), MB_OK);
}
}
'2590:' vs '25910'
'2600:' vs '26010'
-------------------------------------------------------------------------------------------------------
出错的double值,使用memcpy强制转换成两个unsigned long,取值见下面逗号分隔符字符串的前两个字段:
0,1087995776,'2610:' vs '26110'
0,1088532032,'3620:' vs '36210'
0,1088685632,'4100:' vs '41010'
0,1088692032,'4120:' vs '41210'
0,1089092032,'5370:' vs '53710'
0,1089165632,'5600:' vs '56010'
0,1089841248,'8870:' vs '88710'
0,1090276448,'11590:' vs '115910'
0,1090359648,'12110:' vs '121110'
转换代码:
double d;
unsigned long longArray[2] = {0, 1087995776};
memcpy(&d, longArray, sizeof(d));