为什么浮点类型变量不能直接比较?而是用一个范围?

并不是不可以,而是不推荐,因为容易出错。从下面的例子中能看出(true打印出来是1,false打印出来是0),由于浮点数有精度的问题,数值结果很容易出现偏差。f2 - 81.2不等于0是因为,f2是float类型的,字面量81.2默认是double,所以由于81.2到float类型已经精度不准了,减去精准的81.2得到的结果肯定也不准了。f1/5=f3也是一样的道理,但由于f2和f3都是81.2转过去的,所以这两是相等的,f3跟81.2是不相等。==0也是一样的道理。如果要比较,结合数据类型和自己要求的精度去判断一个范围,在这个范围内可以视为相等,比如精度要求不高,判断81.2时可以选择 81.19< X < 81.21,精度要求高可以选择 81.19999< X < 81.20001

	float f1 = 406;
	float f2 = 81.2;
	float f3 = f2 - 81.2;
	printf("f1 = %f, %d\n", f1, sizeof(f1));
	printf("f2 = %f\n", f2);
	printf("f3 = %f\n", f3);
	printf("if(f3 == 0) = %d\n", (f3 == 0));
	f3 = f1 / 5;//81.2
	printf("\nf1 / 5 = %f\n", f3);
	printf("if(f3 == f2) = %d\n", (f3 == f2));
	printf("if(f3 == 81.2) = %d\n", (f3 == 81.2));
	f3 = f3 - f2; 
	f2 = 0;
	printf("\nf3 - f2 = %f\n", f3);
	printf("if(f3 == f2) = %d\n", (f3 == f2));
	printf("if(f3 == 0) = %d\n", (f3 == 0));

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页