首先我们应该知道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");