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; }