Как округлить десятичное значение с основанием, отличным от 10? - PullRequest
1 голос
/ 29 мая 2020

Обычная функция RoundUp с базой 10 выглядит следующим образом:

public static decimal RoundUp(this decimal value, int decimals)
        {
            var k = (decimal)Math.Pow(10, decimals);
            return Math.Ceiling((value * k)) / k;
        }

, поэтому она работает так:

decimal number = 10.12345m;
number.RoundUp(3) => 10.124
number.RoundUp(2) => 10.13
number.RoundUp(1) => 10.2 
etc.

Я хотел бы иметь функцию, которая округляет вверх к ближайшему значению следующим образом:

decimal number = 10.12345m;
number.RoundUp(0.1) => 10.2          
number.RoundUp(0.25) => 10.25 
number.RoundUp(2.0) => 12
number.RoundUp(5.0) => 15 
number.RoundUp(10) => 20 

Примечание. Округление по @basis означает, что результат делится на @basis без остатка:

RoundUp(10.12345m, 0.15) => 10.2   check 10.2 / 0.15 = 68 

соседи 10,05 и 10,35, поэтому правильное округление 10,12345 составляет 10,2

RoundUp(5, 2.25) => 6.75   check 6.75 / 2.25 = 3

, т.е. 2,25x2 = 4,50 меньше 5. Таким образом, округление 5 на 2,25 будет 6,75

RoundUp(5, 2.50) => 5.0   check 5 / 2.5 = 2 

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Вам нужно умножить коэффициент округления на верхний предел деления, как таковое:

public static decimal RoundUp(this decimal value, decimal round)
{
    return Math.Ceiling(value / round) * round;
}

Dotnetfiddle не поддерживает методы расширения, но вот подтверждение концепции: https://dotnetfiddle.net/BIkLC3

Если вы хотите округлить до следующего десятичного числа, вам нужно округлить целое и десятичное отдельно:

public static decimal RoundUp(decimal number, decimal round)
{
    decimal numberDecimal = number - Math.Truncate(number);
    decimal roundDecimal = round - Math.Truncate(round);
    decimal numberWhole = number - numberDecimal;
    decimal roundWhole = round - roundDecimal;
    if (roundWhole > 0)
        numberWhole = Math.Ceiling(number / roundWhole) * roundWhole;       
    if (roundDecimal > 0)
        roundDecimal = Math.Ceiling(numberDecimal / roundDecimal) * roundDecimal;
    return numberWhole + roundDecimal;
}

Рабочая скрипка: https://dotnetfiddle.net/vqf0jB

0 голосов
/ 29 мая 2020

Оказывается, это довольно простая математика:

 public static decimal RoundUp(this decimal value, decimal @base)
    {
        var n = Math.Ceiling((value + @base) / @base) -1;         
        return (n * @base);
    }   
}

ссылка на rextester

0 голосов
/ 29 мая 2020
public static decimal RoundUp(this decimal value, decimal decimals)
{
    return Math.Ceiling(value /decimals) * decimals;
}

Хотя вы не можете буквально назвать это с помощью RoundUp (0,1), вам придется использовать RoundUp (0,1 м)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...