这种精度损失发生在哪里以及如何防止它?

Posted

技术标签:

【中文标题】这种精度损失发生在哪里以及如何防止它?【英文标题】:Where does this precision loss happen and how to prevent it? 【发布时间】:2012-02-17 19:47:23 【问题描述】:

我正在 Qt 中编写一个简单的工具,它从两个 GPX (XML) 文件中读取数据并以某种方式组合它们。我使用包含具有 6 位小数精度的航点的跟踪日志测试了我的工具。当我从 GPX 文件中读取它们时,精度会降低到 4 个十进制数字(正确舍入)。所以例如这个原始标签:

<trkpt lat="61.510656" lon="23.777735">

当我的工具再次写入时变成了这个:

<trkpt lat="61.5107" lon="23.7777">

调试输出显示此行发生精度损失:

double lat = in.attributes().value("", "lat").toString().toDouble();

但我不明白为什么。 in 是从文本文件句柄读取的 QXmlStreamReader

【问题讨论】:

【参考方案1】:

可能是当您将值写入回 XML 时。请在您的问题中发布该代码。

如果我在看到代码之前猜到了,您正在使用 QString::number 将双精度转换回字符串。转换中的默认精度为 6,这与您所看到的相对应。您可以提高精度以获取所有小数。

【讨论】:

我把这个:qDebug() 试试:qDebug() &lt;&lt; QString::number(lat, 'f', 10) 我打赌一切最终都会使用QString QString::number(double n, char format = 'g', int precision = 6 ) 这就是票! QString::number 确实是罪魁祸首。

以上是关于这种精度损失发生在哪里以及如何防止它?的主要内容,如果未能解决你的问题,请参考以下文章

犰狳:矩阵乘法精度损失

PHP 代码注入 - 这怎么会发生以及如何防止它?

防止表视图被重用(MVVM)

分配后列表意外更改,这是为啥以及如何防止它?

C#decimal是啥类型以及它的作用

如何在 Pytorch 中实现 dropout,以及在哪里应用它