Как округлить вверх или вниз на С#?
Я пробовал использовать 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 десятичных знаков.
Ответы
Ответ 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.