背景
项目有个评分功能,客户可以对购买的应用评分,评分要求保留一位小数。
问题描述
测试:评分有bug
测试:用户A
对应用a
评 0.5,用户B
对 应用a
评 2,应用a
的 评分:(0.5+2)/2=1.25,评分应该是1.3
,但评分显示的是 1.2
。
我:好的,我看下
查找bug
项目使用 Math进行的四舍五入,怎么会有问题?
项目代码:
return Math.Round(score, 1);
测试 Math 对第二位小数是5四舍五入的情况:
发现0.15与0.25的结果都是0.2
bug分析
发现Math.Round()
方法第三个参数是一个枚举 MidpointRounding
·,默认为 ToEven
- ToEven =0:四舍五入到最接近的数字的策略,当一个数字介于另外两个数字之间时,它会向最接近的偶数四舍五入。
- AwayFromZero= 1: 四舍五入到最接近的数字的策略,当一个数字介于另外两个数字之间时,它会四舍五入到远离零的最接近的数字。
- ToZero=2 :定向四舍五入的策略,其结果最接近且大小不大于无限精确的结果。
- ToNegativeInfinity =3 :向下四舍五入的策略,结果最接近且不大于无限精确的结果。
- ToPositiveInfinity=4: 向上舍入的策略,结果最接近且不小于无限精确的结果。
Math.Round()
将枚举使用为MidpointRounding.AwayFromZero
,解决bug:
return Math.Round(score, 1,MidpointRounding.AwayFromZero);