问题的触发点是 Math.Round 没有进行四舍五入

Math.Round(369) // 结果是184

这里其实不叫四舍五入,而叫四舍六入,五看奇偶,向偶数舍入

即取偶数,如下面,

2.145 , 4 是偶数,那么就取4

2.155,5是奇数,则将5变成偶数,取6

标准的方法是四舍六入,五看奇偶
如果是5的话,就看5后面还有没有数,有数就入
如果5后面都是0了,则看前面一位,是偶数就舍,是奇数就入
2.145001,5后面有001,不为0,所以要入一位,变成2.15
如果是2.145000,则直接把去掉,变成2.14,因为5的前一位是偶数4
如果是2.155000,则入一位变成2.16,因为5的前面一为是奇数5

所以要实现四舍五入需要加个参数 MidpointRounding.AwayFromZero

AwayFromZero 从零开始,为什么叫从零开始?没找到我想要的答案,只能硬套:

从0开始,那么0,1,2,3,4 是舍,5,6,7,8,9是入

Math.Round(0.4, MidpointRounding.AwayFromZero); // result:0
Math.Round(0.6, MidpointRounding.AwayFromZero); // result:1
Math.Round(0.5, MidpointRounding.AwayFromZero); // result:1
Math.Round(1.5, MidpointRounding.AwayFromZero); // result:2
Math.Round(2.5, MidpointRounding.AwayFromZero); // result:3
Math.Round(3.5, MidpointRounding.AwayFromZero); // result:4
Math.Round(4.5, MidpointRounding.AwayFromZero); // result:5

如果是对小数进行四舍五入,需要将数字转换为decimal,

因为浮点数一般是约等于的值,每次计算出的可能都不一样,所以要得到期望的值,就需要转换为decimal

Math.Round(526.925, 2)
526.92
 
Math.Round(526.925, 2,MidpointRounding.AwayFromZero)
526.92
 
Math.Round((decimal)526.925, 2)
526.92
 
Math.Round((decimal)526.925, 2,MidpointRounding.AwayFromZero)
526.93

关于MidpointRounding枚举的说明

https://learn.microsoft.com/zh-cn/dotnet/api/system.midpointrounding?view=net-6.0#system-midpointrounding-awayfromzero

AwayFromZero1舍入到最接近的数字的策略,当数字在两个数字之间的中间时,它将舍入到离零的最接近的数字。
ToEven0舍入到最接近的数字的策略,当数字在两个数字之间的中间时,它将舍入到最接近的偶数。
ToNegativeInfinity3向下定向舍入的策略,结果最接近且不大于无限精确结果。
ToPositiveInfinity4向上定向舍入的策略,结果最接近且不小于无限精确结果。
ToZero2定向向零舍入的策略,结果最接近且数量级不大于无限精确结果。


更多参考

https://blog.csdn.net/qq_39200110/article/details/103667498