求qt如何解决小数计算过程中的精度丢失

问题描述

在下面的例子中,变量a减去一个常量,本该值为0.90,但是通过程序得到a的值0.8999999999,例子如下:

qreal a = 0.95;
a = a - 0.05;

不光是做减法的时候会出现这样的问题,还有做乘法的时候也会出现这样的问题,例子如下:

qreal a = 1.15;
int b = a * 100;

本该a乘以100 后得到的b的值应该为115,然后程序得到的是114。

原因

网上找到的答案是计算机内部需要将小数后的位数转换为二进制,在这个过程中存在精度的丢失。(大体是这样,时间原因未深究)

解决方法

初步采用字符串转换的方式,但似乎并没有完全解决。

  //将m_scale四舍五入取2位QString str = QString::asprintf("%.2f",a);a = str.toDouble();

在采用字符串这样转换的情况下,只是解决了上述相减导致的值不正确的现象。求相乘时如何解决精度丢失。
对于上述两个现象,希望得到正确的数值,望大牛不吝赐教。
后续已经跟进解决,上面对于qreal类型变量与100相乘得到整数,故而无法将最后的正确数值得到,究其原因是因为定义的变量不应该是int型的变量来接收两者相乘的数值,而应该定义未qreal类型。下面上代码:
原来的写法是:

int ratio = m_scale * 100;
if(ratio == 114)//只是简单解决精度丢失254 229 204
{ratio = 115;
}
else if(ratio == 204)
{ratio = 205;
}
else if(ratio == 229)
{ratio = 230;
}
else if(ratio == 254)
{ratio = 255;
}

改进之后的写法:

   qreal ratio = m_scale * 100;//将m_scale四舍五入取2位解决精度丢失2021-3-18QString str = QString::asprintf("%.2f",ratio);ratio = str.toDouble();

按照上述的方式可以解决精度丢失问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山城虽寒、但物联却热,探访中移物联小记一笔……

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!这是小编第二次来到山城重庆,尽管春寒料峭但却收获颇丰,要问缘…

Redis的启动、使用和停止

1、Redis的启动 (1)前端模式启动 ①直接运行bin/redis-server将以前端模式启动:切换到 /usr/local/redis/bin目录下,然后./redis-server ; ②前端模式的缺点是启动完成后,不能再进行其他操作&#xff1b…

企业实战(Jenkins+GitLab+SonarQube)_08_jenkins安装和第一个Java项目构建

接上一篇:企业实战07_Jenkins 安全设置https://blog.csdn.net/weixin_40816738/article/details/90383721 文章目录1. 集成maven插件:2. 通过SSH发送构建工件3. 系统管理员邮件地址4. 基础配置4.1. 配置jdk4.2. 配置Git4.3. 配置Maven5. 集成gitlab代码版…

qt在加入Q_OBJECT宏之后出现编译错误

提要 之前的项目编译运行都没有问题,在 加入Q_OBJECT宏之后整个项目编译的时候就出现了问题,会提示无法解析的外部命令xxxxxx。 解决方法 在.pro文件中,随便改动一丁点,当然不能变动你写的正确的代码,这里的随便改动…

滴滴全链路压测解决之道 | 技术头条

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:张晓庆转自:Java架构沉思录滴滴出行创立于 2012 年&#…

企业实战(Jenkins+GitLab+SonarQube)_09_jenkins发布项目到测试环境

接上一篇:企业实战08_jenkins安装和第一个Java项目构建https://blog.csdn.net/weixin_40816738/article/details/90454587 文章目录1. 配置远程测试服务器主机2. 在视图中选择项目(testToGitLab)3. 选择【配置】4. 配置和发布脚本1. 配置远程…

qt添加资源文件后编译失败,提示Qt:Error:No rule to make target ’ … /…/??.png’,needed by ‘debug/qrc_qrc.cpp’ stop

提要 项目本来编译没有问题,资源文件忘记添加了,于是添加资源文件后,编译没有通过,提示错误:Qt:Error:No rule to make target ’ … /…/??.png’,needed by ‘debug/qrc_qrc.cpp’ stop. 解决方法 查…

Linux 安装、卸载JDK

Linux 安装卸载JDK 第一种方式(手动上传): 1、查看已安装的jdk2、卸载jdk3、再次检查jdk是否已卸载4、上传jdk、解压jdk5、配置环境变量6、重新加载全局环境配置7、查看jdk版本 一、卸载系统已有的JDK 1、查看已安装的jdk rpm -qa|grep jdk2、卸载jdk rpm -e -…

qt窗口左上角坐标变动函数使用中的误区

提要 窗口大小不变,窗口的左上角坐标中的x或者y变动。 误区 函数setX,setY与函数moveLeft,moveTop。其中setX,setY在设置左上角坐标的时候会将窗口的大小变化,相当于窗口进行了拉伸或者缩放,而moveLeft,moveTop设置左上角坐标中的x与y时&a…

亚马逊退出中国?

戳蓝字“CSDN云计算”关注我们哦!整理 | 伍杏玲责编 | 唐小引封图 | CSDN 付费下载自东方IC出品 | CSDN(ID:CSDNnews)北京时间4月17日,据”媒体训练营“报道:亚马逊将在本周宣布退出中国,确切时…

Centos/Red Hat6.8 安装、配置、启动Gitlab (外网环境)

一、登录gitlab官网 官网:https://about.gitlab.com/install/ 二、操作步骤 1. 安装并配置gitlab必要的依赖项2. 添加GitLab软件包存储库3. 将加GitLab软件仓库更新改为清华大学开源软件镜像站4. 安装Gitlab软件5. 设置external_url(web访问地址)6. 重新加载Gi…

qt浮动窗口

提要 鼠标进入窗口后,窗口放大,且出现标题栏,鼠标移开,窗口标题栏隐藏,窗口还原。对于放大后超出显示区域的窗口,将窗口进行移动,使其在显示区域内。对于可以看清的窗口,只浮动显示…

边缘计算精华问答 | 5G是否会“逼退”4G?

新的数据需求也催生了新的技术和商业模式,这便是最近一两年来边缘计算所产生的大背景,大火的边缘计算的核心技术是什么,面临着哪些挑战?今天就让我们来看看关于边缘计算的精华问答吧。1Q:边缘计算参考架构什么样&#…

企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查

文章目录一、前期准备1.1. jenkins 服务器搭建完成1.2. sonarqube服务器搭建完成二、Jenkins 配置2.1. 安装 Sonar 插件2.2. 配置 SonarQube servers2.3. 配置 SonarQube Scanner三、新建任务和配置3.1. 添加描述3.2. 设置最大构建数量,防止内存溢出3.3. 添加项目远…

qt怎么创建pri文件

提要 当多人合作开发一个项目的时,若每人创建一个工程,就会出现同一个项目中多个pro文件。pri文件就是解决多个pro文件的一种方式,方便了最后代码的合并。 示例 1.如何建立pri文件 2.pri文件与pro文件之间的联系怎样建立 如何建立pri文件…

阿里云智能技术战略架构师陈绪:透视2019云计算酣战

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者: 陈绪博士,阿里云智能技术战略架构师。转自:云…

qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码

提要 程序编号后自己模拟的数据程序在生成和解析json时都正常,但是换了一组数据,生成的json文件中部分中文乱码,且出现json文件的格式被混乱的现象。 效果 上述出现的不正确的json文件,如下: {"btnInfo"…

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 完美解决(tomcat error)

error: Linux下启动和关闭tomcat报错,如下图所示: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program Neither the JAVA_HOME nor the …

Observers:让 ZooKeeper更具可伸缩性 | 时光机

戳蓝字“CSDN云计算”关注我们哦!时光机:搭载这部时光机,带您回顾《程序员》大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点、solve难题、提高自我,仍有非凡意义。作者&a…

企业实战(Jenkins+GitLab+SonarQube)_10_Jenkins通过Depoly插件热部署Java程序

文章目录一、 编辑配置文件1.1. 进入tomcat的conf目录1.2. 编辑tomcat-users.xml文件1.3. 添加配置信息二、 配置说明三、 启动tomcat服务3.1. 启动tomcat3.2. 浏览器访问3.3. 点击Manager App访问4033.4. 编辑配置文件3.5. 注释value部分3.6. 浏览器再次请求四、新建任务&…