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

C#中Math.Round保留两位小数结果异常?求正确实现方式

解决C#中decimal舍入不符合预期的问题

你的问题核心在于:606.60499999999999999999999999m这个decimal值实际小于606.605,而MidpointRounding.AwayFromZero只在数值恰好处于两个舍入值的中点(也就是两位小数舍入的临界点606.605)时,才会向远离0的方向进位。因为你的数没到这个中点,所以Round后自然得到606.60。

要让它返回606.61,有两种靠谱的处理方式:

方法一:先舍入到更高精度,触发中点进位

先把数值舍入到3位小数,把末尾的9凑成5,再舍入到两位小数:

decimal aDecimal = 606.60499999999999999999999999m;
decimal result = Math.Round(Math.Round(aDecimal, 3, MidpointRounding.AwayFromZero), 2, MidpointRounding.AwayFromZero);
// 最终result为606.61

原理:第一次舍入到3位时,606.604999...会被进位成606.605,此时再舍入两位就触发了中点规则,AwayFromZero会把它进位到606.61。

方法二:修正数值的来源(如果是转换导致的)

如果这个decimal值是从double类型转换过来的,问题根源在于double无法精确表示606.605,转成decimal时会变成606.604999...这种近似值。这时候直接用decimal字面量定义目标值即可:

decimal aDecimal = 606.605m;
decimal result = Math.Round(aDecimal, 2, MidpointRounding.AwayFromZero);
// 结果直接是606.61

内容的提问来源于stack exchange,提问作者MojoDK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:03:27