如何从QJsonObject中获取精确数值?
问题解决方法
问题根源
- 浮点数存储特性:
double属于二进制浮点数,无法精确表示所有十进制小数,44112.25895恰好是这类无法精准存储的数值,存入QJsonValue后会存在微小精度误差。 - 调试输出格式化:
qDebug()默认对double类型的QJsonValue做四舍五入格式化,仅显示一位小数,导致输出结果为44112.3,但实际存储的数值更接近原始输入。
解决方案
方案一:用字符串存储精确数值(推荐用于需保留原始十进制精度的场景)
将数值以字符串形式存入QJsonObject,读取时再转换为所需类型,彻底避免浮点数精度损失:
QJsonObject qj{ {"close", QString("44112.25895")} }; qDebug() << qj; QJsonValue qjv = qj.value("close"); // 读取时还原为字符串 QString preciseStr = qjv.toString(); // 如需转换为数值,可使用toDouble()或高精度类型 double preciseDouble = preciseStr.toDouble(); qDebug() << preciseStr; qDebug() << preciseDouble;
输出结果会完整保留原始精确数值:
QJsonObject({"close":"44112.25895"}) "44112.25895" 44112.25895
方案二:强制调试输出显示更高精度(仅用于查看真实存储值)
如果只是需要在调试时看到double的实际存储值,可设置qDebug()的浮点数输出精度:
QJsonObject qj{ {"close", 44112.25895} }; qDebug() << qj; QJsonValue qjv = qj.value("close"); // 设置浮点数输出精度为10位小数 qDebug().setRealNumberPrecision(10); qDebug() << qjv; qDebug() << qjv.toDouble();
输出会显示double实际存储的近似值:
QJsonObject({"close":44112.25895}) QJsonValue(double, 44112.25894999999) 44112.25894999999
注意事项
如果业务场景需要精确的十进制计算,建议避免直接使用double,可采用以下方式:
- 用字符串存储数值,计算时转换为高精度类型(如Qt 5.15+提供的
QDecimal) - 使用第三方高精度数值计算库
内容的提问来源于stack exchange,提问作者steven cn2018
相关产品推荐
相关产品推荐

