C#使用Math.Round四舍五入的问题

近日在处理数据的时候,客户要求将小数四舍五入成整数,使用Math.Round实现

decimal result = Math.Round(368.5);

得出的结果是368,与期待值出现偏差。

后来查询文档,Math.Round方法默认使用银行家舍入法,就是四舍六入五考虑,五后非空就进一,五后为空看奇偶,五前为偶应舍去,五前为奇要进一。

在Math.Round最后还有一个参数是MidpointRounding,是用来设置中点舍入规则的,也就是当需要舍入的小数位为中值5的时候如果取舍。

这是一个Enum类型,文档中提示有五个值,但我的VS里只有两个值AwayFromZero和ToEven,可能版本不同。

默认是ToEven,如果设置为AwayFromZero,会将中间值舍入最接近零的数字,在正数里可以实现四舍五入,但是如果在负数里就会出现四舍六入,若要实现正数负数都四舍五入,可以在使用Math.Round方法前先判断是否为负数,若为负数,取绝对值,等四舍五入之后再转成负数。

        private decimal Round(decimal d, int decimals)
        {
            decimal sign = 1;
            decimal result = d;
            if (d < 0)
            {
                sign = -1;
                result *= sign;
            }
            result = Math.Round(result, decimals, MidpointRounding.AwayFromZero);
            result *= sign;
            return result;
        }

 

posted @ 2020-12-11 09:28  Name=DIC  阅读(423)  评论(0编辑  收藏  举报