Dotnet
问题的触发点是 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枚举的说明
AwayFromZero | 1 | 舍入到最接近的数字的策略,当数字在两个数字之间的中间时,它将舍入到离零的最接近的数字。 |
ToEven | 0 | 舍入到最接近的数字的策略,当数字在两个数字之间的中间时,它将舍入到最接近的偶数。 |
ToNegativeInfinity | 3 | 向下定向舍入的策略,结果最接近且不大于无限精确结果。 |
ToPositiveInfinity | 4 | 向上定向舍入的策略,结果最接近且不小于无限精确结果。 |
ToZero | 2 | 定向向零舍入的策略,结果最接近且数量级不大于无限精确结果。 |
更多参考