迭代 QList<double> 更改列表值

Iterating QList<double> changes list values

我试图在 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,但结果并非如此

我也打印了值,如下所示。

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

你的意思是最后一位不同?如果是这样,最后一位可能不同,因为十进制数字不是逐位保存在内存中的。

这只是一个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;
}