在c#中,小数的上下四舍五入有不同的情况

本文关键字:情况 四舍五入 上下 小数 | 更新日期: 2023-09-27 18:06:09

我用c#编写了计费系统的应用程序。

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

当以cents 0.00, 0.01, 0.02结尾时,将把四舍五入为0.00

例子:

  • 10.00、10.01或10.02四舍五入到10.00
  • 10.10、10.11或10.12四舍五入到10.10
当以cents 0.03, 0.04, 0.05结尾时,会将四舍五入为0.05

例子:

  • 10.03、10.04或10.05四舍五入为10.05
  • 10.13、10.14或10.15四舍五入到10.15
当以cents 0.05, 0.06或0.07结尾时,四舍五入为0.05

例子:

  • 10.05、10.06或10.07四舍五入到10.05
  • 10.15、10.16或10.17四舍五入到10.15

当以cents 0.08或0.09 **结尾时,将**四舍五入为0.10

例子:

  • 10.08或10.09四舍五入到10.10
  • 10.18或10.19四舍五入到10.20
现在的问题是我不能使用Math。取整,因为答案不同且不符合系统要求。假设我的总账单是10.14,它将舍入到10.10但它的答案应该是舍入到10.15

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

在c#中,小数的上下四舍五入有不同的情况

我建议使用一种扩展方法来检查最后一位数字。但你可以做到这一点,只需通过乘法并确保你使用正确的整数类型。

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

如何四舍五入到最接近的0.5?

简单的回答是:

public decimal Round(decimal value)
{
    return Math.Round(value * 20) / 20;
}
static public decimal RoundToNickel(decimal value)
{
    var mod = value % 0.05M;
    if (mod >= 0.03M)
    {
        return value + 0.05M - mod;
    }
    return value - mod;
}