Math.Round()舍入规则疑问:为何88.5得88、89.5得90?
关于Math.Round()舍入结果差异的原因
这其实是.NET里Math.Round()默认采用的**银行家舍入法(Bankers Rounding)**导致的,也就是行业里常说的「四舍六入五成双」规则。
核心逻辑
当需要舍入的数字正好处于两个整数的中间(比如小数点后是5,且没有更多小数位)时,规则会这样处理:
- 如果前一位数字是偶数,就直接舍去末尾的5,保持前一位不变;
- 如果前一位数字是奇数,就把前一位加1,舍去末尾的5。
这种设计的目的是为了在大量重复的舍入操作中平衡误差——如果每次遇到5都向上舍入,长期下来整体计算结果会系统性偏大,而银行家舍入法能让舍入的误差相互抵消,结果更接近真实平均值。
对应你的例子解析
- 执行
double d1 = Math.Round(88.5, 0);时,88是偶数,所以舍去5,结果为88; - 执行
double d2 = Math.Round(89.5, 0);时,89是奇数,所以进一位,结果为90。
如何自定义舍入规则
如果你需要传统的「四舍五入」(遇到5就向上舍入),可以使用Math.Round的重载方法,指定MidpointRounding枚举参数:
// 传统四舍五入,88.5会得到89,89.5得到90 double d1 = Math.Round(88.5, 0, MidpointRounding.AwayFromZero); double d2 = Math.Round(89.5, 0, MidpointRounding.AwayFromZero);
另外还有MidpointRounding.ToZero(向0舍入)等其他选项,可以根据具体业务需求选择。
内容的提问来源于stack exchange,提问作者Drakoo
相关产品推荐
相关产品推荐

