我正在嘗試在 quint32 中轉換具有 4 位小數的雙精度,但是當我迭代串列時,值是不同的。

我在第一個周期添加了一個斷點,這些是變數,我怎樣才能讓“i”成為 112778?
編輯:
這是代碼:
QList<double> list;
list << 11.2778;
list << 11.3467;
list << 11.3926;
list << 11.4531;
list << 11.4451;
list << 11.4625;
list << 11.4579;
list << 11.4375;
list << 11.4167;
list << 11.6285;
list << 11.5625;
list << 11.4427;
list << 11.4278;
list << 11.4063;
list << 11.2500;
for(double value : list)
{
double v = value * 10000;
quint32 i = v;
qDebug() << v << i;
}
我期待這些數字在沒有浮點的情況下轉換為 quint32,但這不是結果
uj5u.com熱心網友回復:
這只是 C 中浮點精度的問題,關于這個主題有很多現有的 SO 問題。我認為問題出在以下事實:11.2778 * 10000可能無法精確計算為112778. 它可能認為它是112777.999999999,或其他。轉換為 int 不會四舍五入到最接近的整數,它只是截斷小數點后的所有內容。所以這就是你可以結束的方式112777。要解決此問題,您可以簡單地強制它舍入:
for(double value : list)
{
double v = value * 10000;
quint32 i = qRound(v); // Round the double to get the best int
qDebug() << value << v << i;
}
uj5u.com熱心網友回復:
我也列印了價值,如下所示。
qDebug() << value << v << i;
輸出如下。
11.2778 112778 112777
11.3467 113467 113467
11.3926 113926 113926
11.4531 114531 114530
11.4451 114451 114451
11.4625 114625 114625
11.4579 114579 114579
11.4375 114375 114375
11.4167 114167 114167
11.6285 116285 116285
11.5625 115625 115625
11.4427 114427 114427
11.4278 114278 114278
11.4063 114063 114063
11.25 112500 112500
你的意思是最后一個數字不同嗎?如果是這樣,最后一位可能會有所不同,因為十進制數字不會逐位保存在記憶體中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443302.html
上一篇:如何在QT中為我的類指定樣式表
