十进制舍入到5或0的整数

问题描述 投票:0回答:2

我有一个Web应用程序,该应用程序将对产品应用百分比标记,但是百分比将由用户指定。例如,用户可以指示他们要标记产品5%,9%,23%等。我的问题是,产品价格也将发生变化,这样做最终会带来丑陋的价值(1462.72美元)

因此,我的用户希望我们可以将值舍入到最接近的5 \ 0值。因此,如果我加价后的产品价格为$ 1462.72,则该价格将舍入为$ 1465。另一方面,$ 1798.02最多可以取整$ 1800。

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

谢谢!

c# vb.net
2个回答
7
投票

要舍入为任意模数,您可以创建一个类似以下的函数:

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默认将中点值四舍五入为最接近的even数字(例如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
投票

您可以使用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的下一个倍数。

© www.soinside.com 2019 - 2024. All rights reserved.