int/int=int(运算结果会对小数部分做舍弃。)
double/double=double(运算结果不会对小数部分进行舍弃。)
例如:6.0/3.0=2.0 不等于2
即:两个相同类型的操作数之间的运算,所得结果的数据类型与操作数的类型一致。
而对于int/double以及double/int,int会自动向上转型为double。
即,二者最终都变成double/double=double
重新回顾一个重要的练习:
程序:
int a;
int b;
double per;
puts("输入两个整数(整数1小于整数2)。");
printf("整数1:");
scanf("%d", &a);
printf("整数2:");
scanf("%d", &b);
per = (double)a / b * 100;
//per = (double)((a*100)/b);
printf("整数1占整数2的百分比%f%%\n", per);
运算结果:
上述程序展示了一个经典的错误:
per = (double)((a*100)/b);
如果运行这行代码,程序可以正常运行,但得出的百分比为:64.000000%,显然不对。
问题出在这里:
(double)是一个类型转换运算符,含义是将后面紧跟的部分转化成double类型。
((a*100)/b)中,a*100是一个整数,(a*100)/b属于int*int,所得的结果是舍弃了小数之后的部分。即64,然后(double)使得这个64(int)变成了64.000000(double)。
正确的思路是:在进行计算之前先将a做(double)处理,然后(a*100)就自动向上转成double*double,结果依然是double,小数部分得到了保留。最后(a*100)/b自动上转为double类型。