整型浮点型混合运算的截断问题及处理
- 整型运算赋值给浮点型
- 整型浮点型混合运算后赋值给浮点型
1. 整型运算赋值给浮点型
(1) 情况处理和结论:
-
整形强制转换运算后赋值给浮点型
结论 : 不会截断
-
整形乘100后直接除以整形后赋值给浮点型
结论:输出截断,乘100相当于保留两位小数后放大100倍,乘1000相当于保留三位小数
-
整形乘1.0f除以整形乘1.0f后赋值给浮点型
结论:不会截断,效果等同于(1)
(2) 代码验证
#include <stdio.h>
int main()
{
int intera = 0;
int interb = 0;
float floata = 0.0f;
float floatb = 0.0f;
int intera = 0;
int interb = 0;
float floata = 0.0f;
float floatb = 0.0f;
printf("input intera : ");
scanf("%d",&intera);
printf("input interb : ");
scanf("%d",&interb);
printf("input floata : ");
scanf("%f",&floata);
printf("\n\n");
//1.整形强制转换运算后赋值给浮点型
floatb = (float)intera/(float)interb;
printf("整形强制转换运算后赋值给浮点型:\n");
printf("floatb = (float)%d/(float)%d\n",intera,interb);
printf("floatb = %f \n\n", floatb);
//输出 : 10/3 = 3.333333
//结论 : 不会截断
//2.整形乘100后直接除以整形后赋值给浮点型
floatb = 100*intera/interb;
printf("整形乘100后直接除以整形后赋值给浮点型 :\n");
printf("floatb = 100*%d/%d\n",intera,interb);
printf("floatb = %f \n\n", floatb);
//输出:100*10/3 = 333.000000
//结论:输出截断,乘100相当于保留两位小数
//3.整形1.0f除以整形1.0f后赋值给浮点型
floatb = (intera*1.0f)/(interb*1.0f);
printf("整形1.0f除以整形1.0f后赋值给浮点型:\n");
printf("floatb = (%d*1.0f)/(%d*1.0f)\n",intera,interb);
printf("floatb = %f \n\n", floatb);
//输出:(10*1.0)/(10*1.0) = 3.333333
//结论:不会截断,等同于(1)
return 0;
}
output:
2. 整型浮点型混合运算后赋值给浮点型
(1) 情况和结论:
-
整形浮点型混合运算后赋值给浮点型:浮点型除以整型
结论 : 不会截断
-
整形浮点型混合运算后赋值给浮点型:整型除以浮点型
结论 : 不会截断
//整形浮点型混合运算后赋值给浮点型1
floatb = floata/interb;
printf("整形浮点型混合运算后赋值给浮点型1:\n");
printf("floatb = %f/%d\n",floata,interb);
printf("floatb = %f \n\n", floatb);
//输出 : 13.6/3 = 4.533333
//结论 : 不会截断
//整形浮点型混合运算后赋值给浮点型2
floatb = interb/floata;
printf("整形浮点型混合运算后赋值给浮点型2:\n");
printf("floatb = %d/%f\n",interb,floata);
printf("floatb = %f \n\n", floatb);
//输出 : 3/13.6 = 0.220588
//结论 : 不会截断
output:
3. 总结:
以上所有情况的处理基本都不会引起截断问题,根据需求使用一种方法用就行了。
但是,同一个项目最好就只使用一种方法处理,尽量避免多种方式混合使用,不是担心程序处理出错,而是避免编写的时候的一些粗心导致不可预知的bug出现而难以定位到错误。