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

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

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

Я попытался использовать математику.Этаж, но он просто округляется до 4.00. Вот пример:

Math.Floor (41.75 * 0.1);

4 ответов


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

два режима округления средней точки:

  1. AwayFromZero - когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое находится от нуля. (Aka, round up)
  2. ToEven - когда номер находится на полпути между двумя другими, оно округляется к ближайшему четному числу. (Будет Благосклонен .16 более .17, а .18 более .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;
}

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

нет встроенной поддержки для точной этаж/ceillin в C#.

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

например,

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

не идеальное решение, но должно работать, если их количество невелико.


еще одно решение-сделать округление к нулю от округления от нуля. Должно быть что-то вроде этого:

    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;
        }
    }