web-dev-qa-db-fra.com

Arrondir à 2 décimales près en c #

Comment puis-je multiplier deux décimales et arrondir le résultat à 2 décimales près?

Par exemple, si l'équation est 41,75 x 0,1, le résultat sera 4,175. Si je fais cela en c # avec des décimales, il arrondira automatiquement à 4,18. Je voudrais arrondir à 4,17.

J'ai essayé d'utiliser Math.Floor mais il arrondit simplement à 4,00. Voici un exemple:

Math.Floor (41.75 * 0.1);
27
startupsmith

La fonction Math.Round(...) a un Enum pour lui indiquer la stratégie d'arrondi à utiliser. Malheureusement, les deux définis ne correspondent pas exactement à votre situation.

Les deux modes d'arrondi à mi-chemin sont les suivants:

  1. AwayFromZero - Lorsqu'un nombre est à mi-chemin entre deux autres, il est arrondi vers le nombre le plus proche qui est loin de zéro. (Aka, arrondis)
  2. ToEven - Lorsqu'un nombre est à mi-chemin entre deux autres, il est arrondi vers le nombre pair le plus proche. (Favorisera 0,16 sur 0,17 et 0,18 sur 0,17)

Ce que vous voulez utiliser est Floor avec une certaine multiplication.

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

La variable output devrait maintenant contenir 4,17.

En fait, vous pouvez également écrire une fonction pour prendre également une longueur variable:

public decimal RoundDown(decimal i, double decimalPlaces)
{
   var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces));
   return Math.Floor(i * power) / power;
}
38
Aren
public double RoundDown(double number, int decimalPlaces)
{
     return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
11
Wichukorn Dandecha

Il n'y a pas de support natif pour les sols/ceillines de précision en c #.

Vous pouvez cependant imiter la fonctionnalité en multipliant le nombre, le sol, puis diviser par le même multiplicateur.

par exemple,

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

Pas la solution idéale, mais devrait fonctionner si le nombre est petit.

5
Kami

Une autre solution consiste à arrondir vers zéro en arrondissant à partir de zéro. Cela devrait être quelque chose comme ceci:

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