C++ charges函数低收入场景下billingAmount始终返回0问题排查
低收入场景下计费金额恒为0的原因
charges函数存在两处明确的逻辑错误,共同导致该问题:
- 整型运算的截断特性引发计算错误
C++语法规则中,如果参与除法运算的两个操作数都是整数,运算结果会自动舍弃小数部分、只保留整数位。你的代码里剩余计费时长T是int类型,除数60也是整型常量,因此T / 60会按整数除法规则计算:测试用例中扣减30分钟免费时长后T=45,45/60的整数运算结果直接为0,无论费率系数取何值,最终乘积都会是0。 - 分支逻辑未做互斥隔离,计算结果被覆盖
当代码走完低收入用户的计费计算分支后,没有写return语句直接返回结果,也没有用else关联后续的非低收入用户判断,代码会顺序向下执行非低收入用户的计费逻辑。由于当前incomeLow为true,!incomeLow && time <= 20的判断条件不成立,会直接进入后续的else块,重新为billingAmount赋值,覆盖掉之前低收入分支算出的结果。且这个else块本身也不符合业务规则:一是非低收入用户的免费额度为20分钟,代码错误扣减了30分钟,二是同样存在整数除法截断问题,最终返回的结果必然是0。
内容的提问来源于stack exchange,提问作者newEra2021
相关产品推荐
相关产品推荐

