Округлить десятичное значение до ближайшего числа 5 или 0

У меня есть веб-приложение, которое будет применять процентную надбавку к продукту, но процент будет указан пользователем. Например, пользователь может указать, что он хочет наценить продукт на 5%, 9%, 23% и т. д. Моя проблема в том, что цена продукта также изменится, и в результате это приведет к уродливым значениям (1462,72 доллара США).

В результате мои пользователи надеются, что мы сможем округлить значение до ближайшего значения 5\0. Таким образом, если моя цена продукта с наценкой составляет 1462,72 доллара, она будет округлена до 1465 долларов. С другой стороны, 1798,02 доллара округляются до 1800 долларов.

Используя VB\C#, как я могу округлить эти значения?

Спасибо!


person ewitkows    schedule 24.02.2014    source источник


Ответы (2)


Чтобы округлить до произвольного модуля, вы можете создать такую ​​​​функцию, как:

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);
person D Stanley    schedule 24.02.2014

Вы можете использовать оператор модуля для расчета необходимой корректировки.

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.

person yoozer8    schedule 24.02.2014