double bbb=3.3922;
double aa=QString::number(aaa,'f',1).toDouble();
double bb=QString::number(bbb,'f',1).toDouble();
qDebug()<<"aa="<
=1.7)
qDebug()<<"通过判断条件";
打印信息如下:
没有进入if语句打印信息
修改判断结果和对应条件之后代码如下:
double aaa=5.0234;
double bbb=3.3922;
double aa=QString::number(aaa,'f',1).toDouble();
double bb=QString::number(bbb,'f',1).toDouble();
qDebug()<<"aa="<<aa<<";bb="<<bb<<";aa-bb="<<aa-bb;
if((aa-bb)>=1.6)
qDebug()<<"通过判断条件";
打印信息如下:
进入了判断条件
就是判断条件有7的时候,判断条件为double类型被转换位数之后,又经过再次运算,就会判断失败,其他数值正常。
解决方法如下:
double aaa=5.1234;
double bbb=3.3922;
double aa=QString::number(aaa,'f',1).toDouble();
double bb=QString::number(bbb,'f',1).toDouble();
double ccc=aa-bb;
double cc=QString::number(ccc,'f',1).toDouble();//重新处理,否则判断异常
qDebug()<<"aa="<<aa<<";bb="<<bb<<";cc="<<cc;
if(cc>=1.7)
qDebug()<<"通过判断条件";
打印信息如下:
暂时这样解决。。。
浮点数在计算机中并不能精确的表示,所以在
判断
两个
double类型
的数时需要其他的手段,而不是直接用==
判断
。
float,
double
分别遵循R32-24,R64-53的标准。所以float的精度误差在1e-6;
double
精度误差在1e-15,所以要
判断
一个单精度浮点数:则是if( abs(f) <= 1e-6);要
判断
一个双精度浮点数:则是if( abs(f) <= 1e-15 );若小于,为0,大于,不为0 。
自己最好的是选择一个合适的精度,来进行
判断
计算机
判断
两个数相等,将
判断
所有的二
进制
位是否相等,当所有的位都相等时,两个数才相等,绝对的相等。
解决方法:
万物没有绝对相等的概念,在我们的程序中:对小数来说,保留
小数点
后几位就足够了,因此两个小数的差在可接受的精度范围内就可以被认为是相等的。
#
qt
5写法
public bool equal(
double
a,
double
b) {
if ((a- b> -0.000001) && (a- b) < 0.000001)
判断
两个
double
型是否相等,不能用
判断
int型的方法去比较,这也是对初学者容易出现的错误,刚开始我在做PUK1730那个题目时候,就犯了这样的毛病。做出来的答案总是错的。
因为我用
double
a,
double
b,if(a==b)...这样就是错的,后来在网上看了别人的代码才知道,比较两个
double
型:fabs(a-b)<=eps,(eps=1e-9),eps的值是起到精确度的作用...
其中QFuzzyIsNull是浮点型与零值的比较函数,QFuzzyCompare是两个浮点型数据的比较函数。
函数原型如下:
[static] bool qFuzzyCompare(
double
p1,
double
p2)
[static] bool qFuzzyCompare(float p1, float p2)
[static] bool qFuzzyIsNull(
double
d)
[static]
首先给出一个场景:我们编写了一个
Qt
界面,然后需要输入一个
double
值,最后要从文件中写出来。所面临的问题:要保证用户输入的值是
Double类型
,并且保证输出的精度和用户的一致。解决办法:最简单的一种方法是利用QInputDialog,获取一个
double
,然后在lineEdit中显示,最后保存到文件中。
代码如下:
//获取数字
number = QInput
由于计算机中数据的存储到最底层,只有1和0,所以会有一个精度的问题。
我们在比较浮点数的时候,在A>B或者A<B的时候,我们可以正常用大于号(>)或者小于号(<)进行比较;
但是我们在
判断
两个浮点数是否相等的时候,则不能直接用==号进行比较,因为这样会有风险
那么如何安全的进行浮点数的比较呢,就用到了
Qt
的一个方法bool qFuzzyCompare(
double
p1,
double
p2),使用方法如下:
double
value1 = 5.323285194326;
浮点数之间的等值
判断
,基本数据类型不能用==来比较,包装数据类型不能用equals来
判断
。
浮点数采用“尾数+阶码” 的编码方式,类似于科学计数法的“有效数字+指数” 的表示方式。二
进制
无法精确表示大部分的十
进制
小数,具体原理参考《码出高效》
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
if (a == b) {
// 预期进入此代码快,执行其它业务逻辑
// 但事实上 a==b 的结果为 false
Float x = Float.valu