Подтвердить что ты не робот

Как округлить вверх или вниз на С#?

Я пробовал использовать Math.Round и MidpointRounding. Это, похоже, не делает того, что мне нужно.

Пример:

52.34567 rounded to 2 decimals UP   = 52.35  
 1.183   rounded to 2 decimals DOWN =  1.18

Нужно ли писать пользовательскую функцию?

Edit:

Я должен был быть более конкретным.

Иногда мне нужно число, например 23.567, чтобы округлить DOWN до 23.56. В этом сценарии...

Math.Round(dec, 2, MidpointRounding.AwayFromZero) gives 23.57
Math.Round(dec, 2, MidpointRounding.ToEven) gives 23.57

Десятичные числа до девяти знаков после запятой могут выходить и должны округляться до 1, 2, 3 или даже 4 десятичных знаков.

4b9b3361

Ответ 1

Попробуйте использовать decimal.Round():

decimal.Round(x, 2)

Где x - ваше значение, а 2 - количество десятичных знаков, которые вы хотите сохранить.

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

decimal.Round(x, 2, MidpointRounding.AwayFromZero);

EDIT:

В свете нового требования (т.е. числа иногда округляются, несмотря на то, что они превышают "полпути" до следующего интервала), вы можете попробовать:

var pow = Math.Pow(10, numDigits);
var truncated = Math.Truncate(x*pow) / pow;

Truncate() удаляет нецелую часть десятичной дроби. Обратите внимание, что numDigits выше должно быть количество цифр, которые вы хотите KEEP, а не общее количество десятичных знаков и т.д.

Наконец, если вы хотите принудительно округлить (урезание действительно является принудительным округлением вниз), вы просто добавите 1 к результату вызова Truncate(), прежде чем делить снова.

Ответ 2

Попробуйте использовать Math.Ceiling (вверх) или Math.Floor (вниз). например, Math.Floor(1.8) == 1.

Ответ 3

Предполагая, что вы используете тип decimal для своих номеров,

static class Rounding
{
    public static decimal RoundUp(decimal number, int places)
    {
        decimal factor = RoundFactor(places);
        number *= factor;
        number = Math.Ceiling(number);
        number /= factor;
        return number;
    }

    public static decimal RoundDown(decimal number, int places)
    {
        decimal factor = RoundFactor(places);
        number *= factor;
        number = Math.Floor(number);
        number /= factor;
        return number;
    }

    internal static decimal RoundFactor(int places)
    {
        decimal factor = 1m;

        if (places < 0)
        {
            places = -places;
            for (int i = 0; i < places; i++)
                factor /= 10m;
        }

        else
        {
            for (int i = 0; i < places; i++)
                factor *= 10m;
        }

        return factor;
    }
}

Пример:

Rounding.RoundDown(23.567, 2) prints 23.56

Ответ 4

Ниже приведен краткий вариант принятого ответа: функции RoundUp и RoundDown:

public double RoundDown(double number, int decimalPlaces)
{
    return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}

public double RoundUp(double number, int decimalPlaces)
{
    return Math.Ceiling(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}

Ответ 5

Полный код с результатом.

  double a = Math.Round(128.5, 0, MidpointRounding.AwayFromZero);

Результат 129

Ответ 6

Класс Math дает вам методы для округления в большую и меньшую сторону, это Math.Ceiling() и Math.Floor() соответственно. Они работают как Math.Round(), но у них есть особенность, они только получают значение и округляют их только до всей части.

Поэтому вам нужно использовать Math.Pow(), чтобы умножить значение на 10 на n-кратные единицы, необходимые для округления мощности, а затем вам нужно разделить на то же умноженное значение.

Важно отметить, что входными параметрами метода Math.Pow() являются double, поэтому вам необходимо преобразовать их в double.

Например:

Если вы хотите округлить значение до 3 десятичных знаков (предположим, тип значения - decimal):

double decimalsNumber = 3;
decimal valueToRound = 1.1835675M;
// powerOfTen must be equal to 10^3 or 1000.
double powerOfTen = Math.Pow(10, decimalsNumber);
// rounded must be equal to Math.Ceiling(1.1835675 * 1000) / 1000
decimal rounded = Math.Ceiling(valueToRound * (decimal)powerOfTen) / (decimal)powerOfTen;


Result: rounded = 1.184

Если вы хотите округлить значение до 3 десятичных знаков (предположим, тип значения - decimal):

double decimalsNumber = 3;
decimal valueToRound = 1.1835675M;
// powerOfTen must be equal to 10^3 or 1000.
double powerOfTen = Math.Pow(10, decimalsNumber);
// rounded must be equal to Math.Floor(1.1835675 * 1000) / 1000
decimal rounded = Math.Floor(valueToRound * (decimal)powerOfTen) / (decimal)powerOfTen;


Result: rounded = 1.183

Чтобы узнать, как их использовать более конкретно, а также чтобы получить больше информации и об обоих методах, вы можете увидеть эти страницы на официальном сайте Microsoft MSDN:

Математический класс

Метод Math.Pow (Двойной, Двойной)

Математический метод пола (десятичный)

Math.Floor Method (Double)

Метод математического потолка (десятичный)

Математический метод потолка (двойной)

Ответ 7

Может быть, это?

Math.Round(dec + 0.5m, MidpointRounding.AwayFromZero);

Ответ 8

попробуйте выполнить это обычное округление

public int Round(double value)
{
    double decimalpoints = Math.Abs(value - Math.Floor(value));
    if (decimalpoints > 0.5)
        return (int)Math.Round(value);
    else
        return (int)Math.Floor(value);
}

Ответ 9

Вы можете достичь этого, используя метод Math.Round() или decimal.Round() -:

Math.Round(amt)
Math.Round(amt, Int32) and other overloading methods.


decimal.Round(amt)
decimal.Round(amt, 2) and other overloding methods.