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

您所在的位置:网站首页 计算器怎么设置计算结果为小数位数值 求qt如何解决小数计算过程中的精度丢失

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

2024-07-15 05:38| 来源: 网络整理| 查看: 265

问题描述

在下面的例子中,变量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-18 QString str = QString::asprintf("%.2f",ratio); ratio = str.toDouble();

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3