You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从QJsonObject中获取精确数值?

问题解决方法

问题根源

  1. 浮点数存储特性:double属于二进制浮点数,无法精确表示所有十进制小数,44112.25895恰好是这类无法精准存储的数值,存入QJsonValue后会存在微小精度误差。
  2. 调试输出格式化: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:12