在C#中用不同的情况向上舍入或向下舍入

时间:2013-03-28 07:29:50

标签: c# winforms decimal

我使用C#编写了结算系统的应用程序。

总账单可以向上或向下舍入,以方便客户向收银员付款。它取决于以美分结尾的最后一个值。我使用数据类型十进制进行计算。

以美分 0.00,0.01,0.02 结束时,向下舍入 0.00

示例:

  • 10.00,10.01或10.02向下舍入到10.00
  • 10.10,10.11或10.12舍入到10.10

以美分 0.03,0.04,0.05 结束时,向上舍入 0.05

示例:

  • 10.03,10.04或10.05 round to 10.05
  • 10.13,10.14或10.15 round to 10.15

以美分 0.05,0.06或0.07 结束时,向下舍入 0.05

示例:

  • 10.05,10.06或10.07向下舍入至10.05
  • 10.15,10.16或10.17 round to 10.15

以美分 0.08或0.09 **结束时,**将向上舍入 0.10

示例:

  • 10.08或10.09向下舍入至10.10
  • 10.18或10.19向下舍入至10.20

现在的问题是我无法使用 Math.Round ,因为答案不同,不符合系统要求。假设我的总账单是10.14 ,它将向下舍入到10.10 但答案应该向上舍入到10.15。

我希望有人帮我解决这个问题。

3 个答案:

答案 0 :(得分:3)

我打算建议一种检查最后一位数的扩展方法。但是你可以通过乘以和确保你使用正确的圆形类型来做到这一点。

你可以从这个答案中得到它。

How do I round to the nearest 0.5?

答案 1 :(得分:3)

简单的答案是:

public decimal Round(decimal value)
{
    return Math.Round(value * 20) / 20;
}

答案 2 :(得分:0)

static public decimal RoundToNickel(decimal value)
{
    var mod = value % 0.05M;

    if (mod >= 0.03M)
    {
        return value + 0.05M - mod;
    }

    return value - mod;
}