double与int类型的比较--分析double的误差

    技术2026-04-14  7

    首先我们应该知道double是可以与int类型直接进行比较的(按照等级double>int,因此比较时,int升为double型来比较) 例如

    int a=2; double c=3.0; if(c>a)//a变为2.0的double ......

    下面我们分析double与int的误差分析

    我写了如下代码作为探究的作证以便大家分析:(可以不用看分析,直接看结果)

    #include<stdio.h> int main() { double a,c; int b; a=2/3*3;//这样是转不了double型的 c=2.0/3*3; b=2/3*3; printf("a=%lf c=%lf b=%d\n",a,c,b); }

    得到以下结果

    a=0.000000 c=2.000000 b=0

    当我们在运算中将类型转换为浮点型进行运算时(例如2/33;7/66;7/33结果都与约分结果相同)似乎因为c是浮点型故并不受小数除不尽的限制,运算的结果与约分的化简效果相当——例如2.0/33是先1/3*3=1,然后2/1——仿佛直接化简了。但事实真的如此吗? 我们用double与int型直接比较来探究: 加上如下代码:

    if(c==2)printf("ok!"); else printf("error");`

    c前面打印结果是2.000000(double)与2(int)比较结果应该是ok 但结果是error,这说明并非像我们想的那样直接化简了,而是最后四舍五了才计算的1.666666*3得出结果并四舍五入得出看似正确的。我们原来打印的c=2.000000并不代表c真实的值。c的值和打印结果是由误差的,那么误差是多少???(无论如何计算,打印出来的值都是约分的值。但是其实际并非这个值,是通不过if判断的!) 经过使用调试我们得到它的值误差在0.0000001上 即在遇到除不尽时我们使用double计算。当其值与得到的表面值误差在0.000001之内时即可当作约分化简。 例如

    if(c>=1.999999&&c<=2.000001)printf("ok");
    Processed: 0.010, SQL: 9