问题的来源:
处理数据的情况下,很多时候要确保数据是整数或者不是整数,或者要通过判断是不是整数来对数据进行进一步处理。
解决步骤:
首先别管别的,直接上手(小数点后14个0):
void main(void)
{
double a = 1.000000000000001;
int b;
b = (int)a;
if((a-b)==0)
printf("这是整数");
else
printf("这不是整数");
}
输出结果:
这不是整数
与其相对的(小数点后15个0):
void main(void)
{
double a = 1.0000000000000001;
int b;
b = (int)a;
if((a-b)==0)
printf("这是整数");
else
printf("这不是整数");
}
这是整数
这是因为double类型有具体的精度。
float对应1e-6,double对应1e-15。对于小于对应精度的是无法识别的。
那么有没有什么办法可以解决精度的问题?
我尝试了将数进行放大再比较的方式:
void main(void)
{
double a = 1.000000000000001;
int b;
b = (int)a;
if(((a*10000000)-(b*10000000))==0)
printf("这是整数");
else
printf("这不是整数");
}
但是结果不变。
void main(void)
{
double a = 1.0000000000000001*10000000;
double d;
int b;
b = (int)a;
d = b*10000000;
if((a-d)==0)
printf("这是整数");
else
printf("这不是整数");
}
这样是可以的,因为通过了运算尾数左移了。