【C语言】 浮点数精度丢失

浮点型变量

         浮点型变量分为单精度(float)型,双精度(double)型和长双精度(long double)型,三类。

浮点数精度丢失  

比如我们赋值给a=1.23456789e10,加10后,应该得到的值是1.234567891e10

#include<stdio.h>
int main() {
	float a,b;
	a = 1.23456789e10;
	b = a + 10;
	printf("%f",b);
	return 0;
}

但结果却如下图所示

我们称这种现象为精度丢失,因为float能够表示的有效数字为7位,最多只能保证1.234567e10的准确性,想要使结果正确,可以把float改成double。

                                        

    浮点数的数值范围与有效数字
类型位数数值范围有效数字
float3210^-37~10^386~7位
double6410^-307~10^30815~16位
long double12810^-4931~10^493218~19位

浮点数的判断

        直接上代码

#include<stdio.h>
int main() {
	float f;
	f = 1.456;
	if (f == 1.456) {
		printf("f is 1.456\n");
	}
	else {
		printf("f is not 1.456\n");
	}
	return 0;
}

        结果当然是“f is not 1.456” 

 

 Why? 

浮点数是不能直接判断相等的!!

 我们看调试代码:

 f赋的值并不是1.456

所以浮点数不能直接判断相等

可以用减法来判断    f - 1.456 >= -1e6 && f - 1.456 <= 1e-6

#include<stdio.h>
int main() {
	float f;
	f = 1.456;
	if (f - 1.456 >= -1e6 && f - 1.456 <= 1e-6) {
		printf("f is 1.456\n");
	}
	else {
		printf("f is not 1.456\n");
	}
	return 0;
}

 ps:

        本人编程小白一个,第一天在c站上发文章,写的不好,欢迎各位提出意见。