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

C#中如何将0.0006这类小于0.01的非零值舍入为0.01保留两位小数

实现逻辑

你当前使用的是标准的两位小数四舍五入规则,要实现「大于0的非零计算值舍入后为0时,强制取最小两位正值0.01」的需求,只需要在原有舍入逻辑后补一层判断即可,不需要修改原有正常场景的舍入规则。

前置优化提示

涉及金额、数量、单价这类要求精确十进制计算的场景,不要使用float/double二进制浮点类型做存储和计算,请统一使用decimal类型,避免二进制浮点精度误差导致的计算偏差(比如经典的0.1+0.2≠0.3的问题)。

具体实现代码

// 先计算原始乘积
decimal product = item.Qtde * item.ValorUnitario;
// 按原有规则做两位小数四舍五入
decimal roundedValue = Math.Round(product, 2, MidpointRounding.AwayFromZero);
// 补特殊规则判断:原始值大于0,但舍入后为0,强制赋值0.01
if (product > 0 && roundedValue == 0)
{
    item.ValorTotal = 0.01m;
}
else
{
    item.ValorTotal = roundedValue;
}

避坑提示:不要直接使用Math.Ceiling处理该需求,该方法会对所有小数位做向上进位,例如0.011会被直接进位为0.02,破坏原有正常数值的四舍五入规则。

场景验证

对应你提到的场景和常规业务场景,计算结果如下:

  • 0.03 * 0.02 = 0.0006:常规舍入结果为0,命中特殊规则,最终取值0.01,符合预期
  • 0.2 * 0.03 = 0.006:常规舍入结果为0,命中特殊规则,最终取值0.01,符合预期
  • 0.5 * 0.02 = 0.01:常规舍入结果为0.01,不触发特殊规则,最终取值0.01
  • 2.5 * 1.2 = 3.00:常规舍入结果为3.00,不触发特殊规则,最终取值3.00
  • 任意乘数为0、乘积为0的场景:不触发特殊规则,最终取值0,符合常规业务逻辑

如果你的业务存在负数金额场景(比如退货、退款),可以对应补负数侧的判断:当product<0且roundedValue==0时,赋值为-0.01m即可。

内容的提问来源于stack exchange,提问作者Ângelo José

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:54:07