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

发布时间:2024年01月18日

背景

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

问题描述

测试:评分有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);

在这里插入图片描述

文章来源:https://blog.csdn.net/M1234uy/article/details/135676270
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。