整数运算表达式赋值给float类型变量结果恒为0问题
异常原因
这是静态类型语言中整数运算的自动类型截断规则导致的:
- 代码中
houseWithHospitalCount和houseCount都是int整数类型,二者做除法时,运算结果默认也是int类型,不会自动保留小数位,计算时会直接丢弃小数部分、只保留整数位结果。 - 当
houseWithHospitalCount < houseCount时,二者相除的结果小于1,整数截断后结果固定为0,再和后续的houseCount做乘法,0乘任何整数结果都是0,最后赋值给float类型的score时,才会把整数0转为浮点型0.0,因此最终返回值始终为0。 - 当两个参数值相等时,除法结果为整数1,后续乘法计算结果正确,因此不会暴露这个类型转换问题。
修复方法
在执行除法运算前,先将其中一个运算数强制转换为float浮点类型,让整个除法运算自动提升为浮点计算,避免整数截断:
score = (float) houseWithHospitalCount / houseCount * houseCount;
注意:强转操作不能包裹整个除法表达式,比如写成
(float)(houseWithHospitalCount/houseCount)是无效的——这种写法会先执行括号内的整数除法得到0,再转浮点也还是0,必须保证除法运算的两个操作数里至少有一个是浮点类型,才会触发浮点运算逻辑。
内容的提问来源于stack exchange,提问作者Hogu
相关产品推荐
相关产品推荐

