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
相关产品推荐
相关产品推荐

