Округление до 2 знаков после запятой в C # - PullRequest
19 голосов
/ 16 августа 2011

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

189,182

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

189,19

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

Ответы [ 3 ]

38 голосов
/ 16 августа 2011

Умножьте на 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), затем выполняя операцию потолка, затем сдвигая десятичную точку обратно в исходное положение.

14 голосов
/ 16 августа 2011

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

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

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


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

Например:

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

фактически даст вам 28380, а не 283.79, который вы ожидаете (a) .

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


(a) Этопотому что самое точное представление IEEE754 с двойной точностью 283.79 на самом деле составляет :

 283.790000000000020463630789891

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

3 голосов
/ 16 августа 2011

Как насчет

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