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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:42:50