You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:24