我想在QJsonObject
中存储一个double
值,以后再检索相同的值。但是,检索到的值的精度较低。
这里是一个例子:
qDebug() << QJsonObject({{"number", 49.195502187}}).value("number").toDouble();
输出49.1955
,而不是49.195502187
。
我已经检查过Why does qjsonvalue todouble conversion cause data loss?,但这与数据类型之间的转换有关,与我的具体情况无关。
如何获取正确的值?
答案 0 :(得分:6)
精度损失仅在显示该值时发生。在内部存储正确的值。为了确保它是这样,将代码分解如下:
QJsonObject json({{"number", 49.195502187}});
double value = json.value("number").toDouble();
qDebug() << value;
然后使用在qDebug() << value;
处设置断点的调试器:
我建议您使用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);
}
为我工作。没有精度损失。一般而言,代码胜于单词,因此,如果您说发生了某些事情,则最好编写一个具有这种效果的断言的测试用例,并且仅在断言证明有问题时才发布问题。这也很清楚地表明了您的期望-代码中没有歧义,就像英文一样(只要您不依赖未定义或实现定义的行为即可)。