代码bug修正
场景:
在if(inum > ilevel)判断语句中,因为要判断num值大于level的80%是进行一些操作,使用的方法是将语句改为if(num > level * 80 / 100)。
问题:
将ilevel设置的很大,但不管inum值有多小,if的判断都会为真,但实际inum数值上不应该大于ilevel的80%,导致了意料之外的逻辑错误。
原因:
当ilevel的值设定较大,比如为100000000时,其乘以80导致其值8000000000超出了int的范围,int容纳数值的范围是-2147483648 ~ 2147483647,8000000000在经过运算后会变成-589934592,除以100后变成了-5899345,这导致只要传入的inum值是正值,就一定会满足大于ilevel的80%的条件,这个原因导致了逻辑错误。
解决方法:任意选择
1、将除以100的操作放在乘以80之前,即:if(num > level / 100 * 80)
这个方法防止运算结果越界,超出int范围
2、将ilevel类型转换为long long(c++语法),即:if(num > (long long)level * 80 / 100)
3、将ilevel类型转换为double,即:if(num > (double)level * 80 / 100)
这两个方法扩大了数据的的范围,long long和double可以存放更大的数据。