问题描述
在下面的例子中,变量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();
按照上述的方式可以解决精度丢失问题。