C#中精确舍入小数的正确方法:解决190.5舍入结果异常
解决方案:实现常规四舍五入替代银行家舍入
你遇到的问题是因为.NET里Math.Round默认使用银行家舍入法(四舍六入五成双)——当小数部分恰好是0.5时,会舍入到最近的偶数,所以190.5会被舍入到190(偶数),191.5则舍入到192(偶数)。
要得到你预期的常规四舍五入结果,有两种简单方式:
1. 直接使用Math.Round的重载参数
不需要额外类库,只需要在调用Math.Round时指定MidpointRounding.AwayFromZero枚举值,就能实现"0.5向远离0的方向舍入"的常规逻辑:
decimal test1 = 190.5m; decimal test2 = 191.5m; var testResult1 = Math.Round(test1, 0, MidpointRounding.AwayFromZero); // 结果为191 var testResult2 = Math.Round(test2, 0, MidpointRounding.AwayFromZero); // 结果为192
2. 自定义舍入方法(无需依赖System.Math)
如果不想用System.Math,可以自己实现简单的舍入逻辑,针对正数场景的示例如下:
decimal CustomRound(decimal number) { // 提取整数部分,判断小数部分是否≥0.5,是则整数部分+1 decimal integerPart = decimal.Truncate(number); decimal fractionalPart = number - integerPart; return fractionalPart >= 0.5m ? integerPart + 1 : integerPart; } // 调用示例 decimal test1 = 190.5m; decimal test2 = 191.5m; var testResult1 = CustomRound(test1); // 191 var testResult2 = CustomRound(test2); // 192
如果需要处理负数,只需调整判断逻辑(比如负数时小数部分≤-0.5则整数部分-1)。
内容的提问来源于stack exchange,提问作者user10466538
相关产品推荐
相关产品推荐

