[Qt] 使用arg()從double轉換到QString的Bug?

    使用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));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章