舍入十进制值到最接近的5或0量

时间:2014-02-24 19:02:29

标签: c# vb.net

我有一个将应用百分比标记的Web应用程序应用于产品,但百分比将由用户指定。例如,用户可以表明他们想要将产品标记为5%,9%,23%等。我的问题是,产品价格也会发生变化,这样做最终会给出丑陋的价值($ 1462.72)

因此,我的用户希望我们可以将值四舍五入到最接近的5 \ 0值。因此,如果我的标记产品价格是1462.72美元,它将会达到1465美元。另一方面,1798.02美元甚至可以达到1800美元。

使用VB \ C#,我该如何舍入这些值呢?

谢谢!

2 个答案:

答案 0 :(得分:6)

要舍入到任意模数,您可以创建如下函数:

public decimal Round(decimal source, decimal modulus)
{
    return (Math.Round(source / modulus) * modulus);
}

并以这种方式使用它:

decimal rounded = Round(1798.02m , 5.0m);  // yields 1800.0
decimal rounded = Round(1462.72m , 5.0m);  // yields 1465.0
decimal rounded = Round(2481.23m , 5.0m);  // yields 2480.0

请注意,默认情况下Math.Round将中点值舍入为最接近的偶数数字(例如1.5和2.5都会“舍入”为2.在您的情况下,效果是任何数字准确地在0到5之间吃(即2.5,7.5)将四舍五入到最接近的10:

decimal rounded = Round(1697.50m , 5.0m);  // yields 1700.0
decimal rounded = Round(1702.50m , 5.0m);  // yields 1700.0

如果您希望始终在中点上舍入,只需在Round中指定:

return (Math.Round(source / modulus, MidpointRounding.AwayFromZero) * modulus);

答案 1 :(得分:1)

您可以使用modulus operator来计算所需的调整。

decimal price = 1798.02;
decimal adjustment = price % 5.0;
if(adjustment != 0) //so we don't round up already round numbers
{
  price = (price - adjustment) + 5;
}

这将使其达到5的下一个倍数。