一、问题
在C语言中,不能使用浮点数进行==和!=运算,比如以下代码:
#include<stdio.h>
int main()
{
float a = 3.14;
if (a == 3.14)
{
printf("%f",a);
}
return 0;
}
运行后会报错,如下:
二、原因
C语言中,==
和!=
是双目运算符,在进行运算时会把两边的数或者变量转换成二进制数来进行对比,从而来判断其相等或是不等。
对于整数来说,可以将之转换为对应确定的二进制数;但对于浮点数来说,浮点数不一定能转换成确定的二进制数,有可能只能转换为无限循环的二进制数,这样一来就无法来进行==
和!=
运算操作。
浮点数转换为二进制的方法:整数部分与小数部分分开转换,例如3.25。整数部分为11;
小数部分的转换方法是:将小数部分一直乘2,直到没有小数。每次乘2后,如果超过1,则减去1,小数部分继续乘2。每乘一次,就把整数部分提取出来,作为二进制数。
如3.25,小数0.252=0.5, 0.52=1
小数 —> 提取整数
0.5 -----> 0
1 -------> 1
所以小数部分为01。
所以3.25=11.01。验证:11.01 = 1 * 2 + 1 + 0 * 2 ^ (-1) + 1 * 2 ^ (-2)=2+1+0+0.25=3.25。
三、解决方法
判断两个数相等或者不相等,我们可以转换成两个数之差是否为0。
比如a=b,变成a-b=0。所以我们只需考虑一个数或者变量与0的关系即可。
所以,C语言中==
和!=
可以用<和>代替。具体如下:
1、针对float
型
a == 0------>a > -1e-15 && a< 1e15
例如:
#include<stdio.h>
int main()
{
float a = 3.14;
if (a == 0)
{
printf("%f",a);
}
return 0;
}
可以替换成:
#include<stdio.h>
int main()
{
float a = 3.14;
if (a > -1e-6 && a< 1e6)
{
printf("%f",a);
}
return 0;
}
2、double型
同理:
a == 0------>a > -1e-15 && a< 1e15