当前位置: 首页 > news >正文

Qt创建Json对象时浮点数的精度控制

我们在Qt中使用Json都是使用QJsonDocument、QJsonArray、QJsonObject、QJsonValue等类。
当我们在QJsonObject中插入浮点数字段时,会发现浮点数的小数位数很长,如下所示:

#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>QJsonObject jo;
float v = 0.12132222111222;
ji.Insert("name", v);//然后转成Json字符串
QJsonDocument doc(jo);
QString str = doc.toJson(QJsonDocument::Compact);qDebug() << str.toStdString().c_str();
//以上代码会输出:
//{"name":0.12132222111222}

可见,QJsonObject没有对浮点数做任何的精度控制,其小数点后原来多少位,转为Json后还是多少位。

通常我们不需要在json字符串中记录显示这么长的浮点数。
有一种办法是将浮点数作为字符串插入json,代码如下:

QJsonObject jo;
float v = 0.12132222111222;
QString vs = QString::number(v, 'f', 2);
ji.Insert("name", vs);//然后转成Json字符串
QJsonDocument doc(jo);
QString str = doc.toJson(QJsonDocument::Compact);qDebug() << str.toStdString().c_str();
//以上代码会输出:
//{"name":"0.12"}

可见浮点数的精度控制在2位了,但是,浮点数被多出来的一对引号(")包裹了,这实际上是把浮点数类型转为字符串类型处理了,这并不是我们想要的。
如果要直接插入精度可控制的浮点数怎么办呢?方法就是,通过QString将浮点数格式化为目的精度的浮点数字符串,然后将浮点数字符串再转回浮点数,最后插入QJsonObject。代码如下:

QJsonObject jo;
float v = 0.12132222111222;
QString vs = QString::number(v, 'f', 2);
double vd = vs.toDouble();
QJsonValue jv(vd);
ji.Insert("name", jv);//然后转成Json字符串
QJsonDocument doc(jo);
QString str = doc.toJson(QJsonDocument::Compact);qDebug() << str.toStdString().c_str();
//以上代码会输出:
//{"name": 0.12}

从输出结果可见,烦人的引号(“)消失了,目的达到了。
需要注意的是,以上代码有一个坑要注意:

//这里一定是double类型和toDouble()函数
double vd = vs.toDouble();//绝对不能是如下float或者toFLoat()函数
float vd = vs.toDouble();
double vd = vs.toFloat();
float vd = vs.toFloat();

不管是出现以上三种中哪一种错误,都会导致精度控制失效。

http://www.lryc.cn/news/418136.html

相关文章:

  • 【海贼王航海日志:前端技术探索】CSS你了解多少?(二)
  • 软件测试面试200问(全)
  • 【单片机毕业设计选题24106】-基于阿里云的心率呼吸监测系统
  • leetcode28:找出字符串第一个匹配的下标
  • Java二十三种设计模式-桥接模式(10/23)
  • Java 面试指南
  • 计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战
  • android13 删除兼容性警告窗口 deprecation warning 去除弃用警告
  • JESD204B/C协议学习笔记
  • 网络安全-渗透测试工具及插件介绍和使用方法
  • JAVA WEB初步实验
  • 30 个 JavaScript 技巧,让你的代码更具可读性
  • 电商行业中选择分账系统的关键因素!
  • 通过继承实现状态模式(C++)
  • 全国多地公布2024下半年软考报名具体时间
  • 【Python】requests的response.text 和 urllib.request 的 response.read()的区别
  • Obsidian插件安装与开发
  • lvs的dr模式实现
  • 免费写作神器,自动生成高质量文章
  • C#属性
  • Spring的代理模式
  • el-table合计放在标题上方且合并列以及渲染后端返回的数据
  • magic-api相关应用与配置
  • AI大模型赋能开发者|海云安创始人谢朝海受邀在ISC.AI 2024大会就“大模型在软件开发安全领域的应用”主题发表演讲
  • 基于Kahn算法|动态线程池,支持扩展点并发执行|召回|过滤
  • Bootstrap 4 表头固定,tbody滚动条
  • MYSQL知识点(持续更新)
  • html+css网页设计 酷狗首页1个页面 (无js)
  • 用户体验至上:9款软件界面设计工具分享
  • Lambda 表达式:解锁编程世界的魔法之门