8
votes

Excel Roundup vs .net Math.Round

dans Excel, = Roundup (474.8721266666666, 2) Code> -> 474.88
En .NET,

Math.Round(474.87212666666666666666666666667, 2, MidpointRounding.ToEven) // 474.87
Math.Round(474.87212666666666666666666666667, 2, MidpointRounding.AwayFromZero) // 474.87


0 commentaires

4 Réponses :


1
votes

Math.Ceuil est ce que vous recherchez.


3 commentaires

Notez que OP devra multiplier par 100 avant d'effectuer des mathématiques, puis divisera par 100, puisque vous ne pouvez pas spécifier le nombre de points décimaux avec cette fonction.


Math.ceiling (474.87212666666666666666666666666667) renvoie 475 ce qui n'est pas ce que je veux.


Math.ceiling (474.872126666666666666666666666666666666666667 * 100) / 100 travaux. Merci à vous deux



18
votes
double ROUNDUP( double number, int digits )
  {
     return Math.Ceiling(number * Math.Pow(10, digits)) / Math.Pow(10, digits);
  }

1 commentaires

Cette solution couvrira assez bien les flux heureux. Malheureusement, cela ne fonctionnera pas correctement pour les nombres négatifs, il ne fonctionnera pas correctement pour le nombre de chiffres négatifs (quels supports Excel) et ne fonctionnera pas correctement lorsque "nombre" s'approche de grandes valeurs telles que Double.max, car vous multipliez un très grande valeur et cela ira hors de portée.



0
votes

Voici mon essai sur une solution qui se comporte comme une fonction Roundup Excel. J'ai essayé de couvrir des cas tels que: nombres décimaux négatifs, chiffres négatifs (Yep Excel soutient que), de grandes valeurs décimales xxx


0 commentaires

0
votes

Voici le calcul correct pour Roundup et Rounddown:

private static object RoundDown(List<Expression> p)
{
    var target = (decimal)p[0].Evaluate();
    var digits = (decimal)p[1].Evaluate();

    if (target < 0) return (Math.Ceiling((double)target * Math.Pow(10, (int)digits)) / Math.Pow(10, (int)digits));

    return Math.Floor((double)target * Math.Pow(10, (int)digits)) / Math.Pow(10, (int)digits);
}

private static object RoundUp(List<Expression> p)
{
    var target = (decimal)p[0].Evaluate();
    var digits = (decimal)p[1].Evaluate();

    if (target < 0) return (Math.Floor((double)target * Math.Pow(10, (int)digits)) / Math.Pow(10, (int)digits));
    return Math.Ceiling((double)target * Math.Pow(10, (int)digits)) / Math.Pow(10, (int)digits);
}


0 commentaires