2013-03-28 90 views
1

我使用C#编写了计费系统的应用程序。在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圆形高达10.05
  • 10.13, 10.14或10.15取整到10.15

当以美分结束时0.05,0 0.06或0.07它将轮向下0.05

实例:

  • 10.05,10.06,10.07或向下舍入到10.05
  • 10.15,10.16,10.17或向下舍入到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。

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

+2

请问乘以2,四舍五入,然后除以2解决您的问题? – 2013-03-28 07:32:27

+0

@ C.Evenhuis,谢谢。对不起,我不擅长数学 – Chuki2 2013-03-28 07:47:39

回答

3

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

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

How do I round to the nearest 0.5?

+0

感谢您给予链接,简单而完美! – Chuki2 2013-03-28 07:46:51

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

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

    return value - mod; 
} 
2

简单的答案是:

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

感谢尼古拉斯,我尝试了你的代码,并且是完美的。 – Chuki2 2013-03-28 08:05:34

+0

如果您使用此选项,请将其标记为答案。 – 2013-03-28 08:20:08