Как округлить десятичное до 2 десятичных знаков в .Net? - PullRequest
9 голосов
/ 26 сентября 2010

Это должно быть легко, но я не могу найти встроенный метод для него , для этого в .net framework должен быть метод!

private decimal RoundDownTo2DecimalPlaces(decimal input)
{
   if (input < 0)
   {
      throw new Exception("not tested with negitive numbers");
   }

   // There must be a better way!
   return Math.Truncate(input * 100) / 100;
}

Ответы [ 5 ]

15 голосов
/ 26 сентября 2010

Если вы округляете вниз , то вам нужно:

Math.Floor(number * 100) / 100;

, если вы ищете что-то под названием «округление банкиров» (вероятно, нет, если это для вывода, а не для статистики /суммирование) затем:

Math.Round(number, 2);

Наконец, если вы хотите, не уверены, каков правильный термин, «нормальное округление»:

Math.Round(number, 2, MidpointRounding.AwayFromZero);
6 голосов
/ 26 сентября 2010

Используйте Math.Floor , если хотите округлить до этого значения, или Math.Round , если хотите получить точный раунд. Math.Truncate просто удаляет десятичную часть числа, чтобы получить отрицательные результаты для отрицательных чисел:

var result= Math.Floor(number * 100) / 100;

Math.Floor всегда возвращает наименьшее целое значение, которое меньше (Floor) или больше (Ceiling), чем указанное значение. Таким образом, вы не получите правильное округление. Пример:

Math.Floor(1.127 * 100) / 100 == 1.12 //should be 1.13 for an exact round
Math.Ceiling(1.121 * 100) / 100 == 1.13 //should be 1.12 for an exact round

Всегда предпочитайте версию Math.Round, содержащую параметр округления средней точки. Этот параметр указывает, как обрабатывать значения средней точки (5) как последнюю цифру.

Если вы не укажете AwayFromZero в качестве значения параметра, вы получите поведение по умолчанию - ToEven. Например, используя ToEven в качестве метода округления, вы получаете:

Math.Round(2.025,2)==2.02 
Math.Round(2.035,2)==2.04

вместо этого, используя параметр MidPoint.AwayFromZero:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04

Итак, для нормального округления лучше всего использовать этот код:

var value=2.346;
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero);
3 голосов
/ 26 сентября 2010

Используйте .Truncate() для получения точной суммы или .Round() для округления.

decimal dNum = (decimal)165.6598F;
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0) / 100.0); //Will give 165.65
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66

Или вы можете создать метод расширения для запуска, например dNum.ToTwoDecimalPlaces();

public static class Extensions
{ 
    public static decimal ToTwoDecimalPlaces(this decimal dNum)
    {
        return ((decimal)(Math.Truncate((double)dNum*100.0) / 100.0));
    }
}
2 голосов
/ 26 сентября 2010
Math.Floor(number * 100) / 100;
0 голосов
/ 30 сентября 2010

В .net Framework нет метода для этого, другие ответы говорят, как написать свой собственный код.

...