如何比较整型的0和double类型的0.0
写在前面的话
1.由于计算机中采用的是有限位的二进制编码,所以浮点数在计算机中的存储不总是精确的,通常会存在一些舍入误差。
2.浮点数表示的数据类型往往具有不精确性,在进行精确度不高的运算时问题还不是很大,但是在进行关系运算时就会出现很大的问题。
3.判断两个浮点数是否相等这个操作本身就充满了风险,并且不合理。
为什么会出现这样的不精确现象呢?
计算机在存储数据类型时,是以二进制的形式存储的,对于double类型的数据也是一样。对于一个十进制的小数转化为二进制时,采用的方法是乘二取整,正序排列。即:对被转换的小数乘以2,取其整数部分(0或1)作为二进制小数部分,取其小数部分,再乘以2,又取其整数部分作为二进制小数部分,然后取小数部分,再乘以2,直到小数部分为0或者已经去到了足够位数。
接下来,我给大家举个例子,例如:十进制0.2转化为二进制。
0.2 x 2 = 0.4 ............0
0.4 x 2 = 0.8 ............0
0.8 x 2 = 1.6 ............1
0.6 x 2 = 1.2 ............1
0.2 x 2 = 0.4 ............0
0.2乘以2,取整后小数部分再乘以2,运算4次后得到的整数部分依次为0、0、1、1,结果又变成了0.2,若果0.2再乘以2后会循环刚开始的4次运算,所以0.2转换二进制后将是001 1的循环,即: (0.2)10=(0.0011 0011 0011 …)2。由于任何数据类型都是有限制的,不能无限的使用计算机内存,这样导致数据出现了舍入误差。
浮点数0.0与整型0之间如何比较呢
如果一个数 a 在 [b-eps, b+eps] 的区间中时,就应当判断为 a==b 成立。经验表明, eps 取 10-8是一个合适的数字——对大多数的情况既不会漏判,也不会误判。
int main (void)
{
double cosA = 0.0;
if(cosA>=-0.000001 && cosA<=0.000001)
{
printf("整型0与浮点型0.0相等 ");
}
}
这样就实现了整型的0和double类型的0.0的比较。