C# 小数最后一位是5四舍五入的Bug

背景

项目有个评分功能,客户可以对购买的应用评分,评分要求保留一位小数。

问题描述

测试:评分有bug
测试用户A应用a 0.5用户B应用a2应用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);

在这里插入图片描述

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值