Округление до 2 знаков после запятой в С#

У меня есть десятичное число, которое может быть следующим:

189,182

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

189.19

Есть ли встроенные функции для этого в классе Math или что-то еще? Я знаю, что существует функция потолка, но это не похоже на то, что я хочу - она ​​будет округлена до ближайшего int, так что просто "189" в этом случае.

Ответы

Ответ 1

Умножьте на 100, потолок вызовов, разделите на 100, делает то, что, я думаю, вы просите

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}

Использование будет выглядеть так:

RoundUp(189.182, 2);

Это работает, сдвигая десятичную точку вправо на 2 места (так что она находится справа от последних 8), а затем выполняет операцию потолка, а затем переводит десятичную точку обратно в исходное положение.

Ответ 2

Ты можешь использовать:

decimal n = 189.182M;
n = System.Math.Ceiling (n * 100) / 100;

Объяснение различных функций округления можно найти здесь.


Имейте в виду, что подобные формулы все еще ограничены ограниченной точностью типа double, если это тип, который вы используете (ваш вопрос указан как десятичный, но возможно, вы просто имели в виду значение с плавающей запятой с дробным компонентом, а не с этим конкретным типом). тип).

Например:

double n = 283.79;
n = System.Math.Ceiling (n * 100);

на самом деле даст вам 28380, а не 283.79 вы ожидаете (а).

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


(a) Это связано с тем, что наиболее точное представление двойной точности 283.79 для 283.79 на самом деле:

 283.790000000000020463630789891

Этот дополнительный (по общему признанию, незначительный) дробный компонент, превышающий .79 получает .79, что означает, что он даст вам значение, превышающее ожидаемое.

Ответ 3

Как насчет

0.01 * ceil(100 * 189.182)