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);
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:
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;
}
public double RoundDown(double number, int decimalPlaces)
{
return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
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.
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;
}
}