为什么QJsonValue :: toDouble会有精度损失?

时间:2018-10-02 12:02:11

标签: c++ json qt

我想在QJsonObject中存储一个double值,以后再检索相同的值。但是,检索到的值的精度较低。

这里是一个例子:

qDebug() << QJsonObject({{"number", 49.195502187}}).value("number").toDouble();

输出49.1955,而不是49.195502187

我已经检查过Why does qjsonvalue todouble conversion cause data loss?,但这与数据类型之间的转换有关,与我的具体情况无关。

如何获取正确的值?

2 个答案:

答案 0 :(得分:6)

原因

精度损失仅在显示该值时发生。在内部存储正确的值。为了确保它是这样,将代码分解如下:

QJsonObject json({{"number", 49.195502187}});
double value = json.value("number").toDouble();

qDebug() << value;

然后使用在qDebug() << value;处设置断点的调试器:

enter image description here

解决方案

我建议您使用QString::number来设置显示值的所需精度,例如:

qDebug() << QString::number(value, 'g', 14);

这将为您提供存储在JSON中的值:

49.195502187

答案 1 :(得分:1)

#include <QtCore>

int main() {  
   auto const value = 49.195502187;
   auto const recovered = QJsonObject({{"number", value}}).value("number").toDouble();
   Q_ASSERT(value == recovered);
}

为我工作。没有精度损失。一般而言,代码胜于单词,因此,如果您说发生了某些事情,则最好编写一个具有这种效果的断言的测试用例,并且仅在断言证明有问题时才发布问题。这也很清楚地表明了您的期望-代码中没有歧义,就像英文一样(只要您不依赖未定义或实现定义的行为即可)。