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

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

Как я могу умножить два десятичных знака и округлить результат до двух знаков после запятой?

Например, если уравнение равно 41.75 x 0.1, результат будет равен 4.175. Если я сделаю это в С# с десятичными знаками, он автоматически округляется до 4.18. Я хотел бы округлить до 4.17.

Я пробовал использовать Math.Floor, но он просто округляется до 4,00. Вот пример:

Math.Floor (41.75 * 0.1);
4b9b3361

Ответ 1

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

Два режима округления Midpoint:

  • AwayFromZero. Когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое находится вдали от нуля. (Aka, round up)
  • ToEven. Когда число находится на полпути между двумя другими, оно округляется до ближайшего четного числа. (Будет любить 0,16 за 0,17 и 0,18 за 0,17).

То, что вы хотите использовать, - это Floor с некоторым умножением.

var output = Math.Floor((41.75 * 0.1) * 100) / 100;

Теперь переменная output должна иметь 4.17.

Фактически вы также можете написать функцию, которая также принимает переменную длину:

public decimal RoundDown(decimal i, double decimalPlaces)
{
   var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces));
   return Math.Floor(i * power) / power;
}

Ответ 2

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

Ответ 3

В С# нет встроенной поддержки прецизионного пол /ceillin.

Однако вы можете имитировать функциональность, умножив число, пол и затем разделите на один и тот же множитель.

например,

decimal y = 4.314M;
decimal x = Math.Floor(y * 100) / 100;  // To two decimal places (use 1000 for 3 etc)
Console.WriteLine(x);  // 4.31

Не идеальное решение, но должно работать, если число мало.

Ответ 4

Еще одно решение - сделать округление к нулю от округления до нуля. Это должно быть примерно так:

    static decimal DecimalTowardZero(decimal value, int decimals)
    {
        // rounding away from zero
        var rounded = decimal.Round(value, decimals, MidpointRounding.AwayFromZero);

        // if the absolute rounded result is greater 
        // than the absolute source number we need to correct result
        if (Math.Abs(rounded) > Math.Abs(value))
        {
            return rounded - new decimal(1, 0, 0, value < 0, (byte)decimals);
        }
        else
        {
            return rounded;
        }
    }