百度搜到自己的网站,网站如何伪静态,十堰网站建设公司电话,做网站需要了解的东西问题描述
在下面的例子中#xff0c;变量a减去一个常量#xff0c;本该值为0.90#xff0c;但是通过程序得到a的值0.8999999999#xff0c;例子如下#xff1a;
qreal a 0.95;
a a - 0.05;不光是做减法的时候会出现这样的问题#xff0c;还有做乘法的时候也会出现这样…问题描述
在下面的例子中变量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();按照上述的方式可以解决精度丢失问题。