考虑一个问题:
有一个矿洞,每小时产出300金币,另有一个精炼池可以百分比提升矿洞的产出效率,假设提升比率为20%,则计算10分钟产出的金币数。
如果直接用int output = 300 * (1 + 20 / 100) 则得到的结果为300,明显错误,这里牵涉到int和double的相互运算问题.
任何复杂的表达式都可以分解为多个如下的格式:
N1 op N2 其中: N1和N2是操作数,op是运算符
Nx=N1 op N2, Nx的类型规则如下 :
1.如果N1和N2是同一类型,Nx和N1同一类型
2.如果N1和N2类型不同,N1和N2中类型优先级低的转化为类型优先级高的,使得N1和N2的类型一致,再进行运算。
类型优先级从小到规则如下:
char < unsigned char < short < unsiged short < int < unsigned int < long < unsigned long < float < double
举例如下:
1+(int)(4/2.0)
// 分解为
t1=4/2.0 //2.0是double类型常量,4转化为double类型,结果t1是double类型
t2=(int)t1 //t1被强制转化为int类型,t2是int类型
t3=t2+1 //t2和1的类型一致,结果是int类型。
总结一句话:算术运算会先隐式转换到相同类型再运算,结果的类型是转换后的类型。
综上,正确的写法是:int output = 300 * (1 + 20 / 100.0)