web-dev-qa-db-fra.com

Algorithme .Net intégré pour arrondir la valeur à l'intervalle de 10 les plus proches

Comment, en C # arrondir une valeur à un intervalle de 10? Par exemple, si j'en ai 11, je veux qu'il renvoie 10, si j'en ai 136, alors je veux qu'il renvoie 140.

Je peux facilement le faire à la main

return ((int)(number / 10)) * 10;

Mais je cherche un algorithme intégré pour faire ce travail, quelque chose comme Math.Round (). La raison pour laquelle je ne veux pas le faire à la main est que je ne veux pas écrire un morceau de code identique ou similaire sur tous mes projets, même pour quelque chose d'aussi simple que ci-dessus.

62
Graviton

Il n'y a pas de fonction intégrée dans la bibliothèque de classes qui fera cela. Le plus proche est System.Math.Round () qui est uniquement pour arrondir les nombres de types Decimal et Double à la valeur entière la plus proche. Cependant, vous pouvez encapsuler votre instruction dans une méthode d'extension, si vous travaillez avec .NET 3.5, ce qui vous permettra d'utiliser la fonction beaucoup plus proprement.

public static class ExtensionMethods
{
    public static int RoundOff (this int i)
    {
        return ((int)Math.Round(i / 10.0)) * 10;
    }
}

int roundedNumber = 236.RoundOff(); // returns 240
int roundedNumber2 = 11.RoundOff(); // returns 10

Si vous programmez avec une ancienne version du framework .NET, supprimez simplement le "this" de la fonction RoundOff et appelez la fonction comme suit:

int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240
int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10
91
Chris Charabaruk

Utilisez Math.Ceiling pour toujours arrondir.

int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);

Le module (%) obtient le reste, vous obtenez donc:

// number = 236 + 10 - 6

Mettez cela dans une méthode d'extension

public static int roundupbyten(this int i){
    // return i + (10 - i % 10); <-- logic error. Oops!
    return (int)(Math.Ceiling(i / 10.0d)*10); // fixed
}

// call like so:
int number = 236.roundupbyten();

modifié ci-dessus: j'aurais dû utiliser mon premier instinct pour utiliser Math.Ceiling

I blogué à ce sujet lors du calcul de UPC chiffres de contrôle .

19
Armstrongest

Arrondir un flottant à un entier est similaire à (int) (x + 0,5), par opposition à simplement lancer x - si vous voulez un multiple de 10, vous pouvez facilement l'adapter.

Si vous voulez simplement faire des mathématiques entières et que vous l'arrondissez à dix, essayez (x + 10/2)/10 * 10.

Edit: J'ai remarqué que cette réponse ne répond pas à la demande de l'auteur d'origine, et est également une forme d'arrondi biaisée que je préfère ne pas faire. Cependant, une autre réponse acceptée a déjà déclaré Math.round (), une bien meilleure solution.

3

Je préfère ne pas apporter la bibliothèque Math ni aller en virgule flottante, donc ma suggestion est simplement de faire de l'arithmétique entière comme ci-dessous où j'arrondis au 1K suivant. Enveloppez-le dans une méthode ou un extrait lambda ou quelque chose si vous ne voulez pas répéter.

int MyRoundedUp1024Int = ((lSomeInteger + 1023) / 1024) * 1024;

Je n'ai pas effectué de tests de performances sur ce point par rapport à d'autres moyens, mais je parierais que c'est le moyen le plus rapide de le faire, sauf peut-être une version décalée et rotative des bits.

1
Dave

Vieille question mais voici un moyen de faire ce qui a été demandé et je l'ai étendu pour pouvoir arrondir n'importe quel nombre au nombre de figues sig que vous voulez.

    private double Rounding(double d, int digits)
    {
        int neg = 1;
        if (d < 0)
        {
            d = d * (-1);
            neg = -1;
        }

        int n = 0;
        if (d > 1)
        {
            while (d > 1)
            {
                d = d / 10;
                n++;
            }
            d = Math.Round(d * Math.Pow(10, digits));
            d = d * Math.Pow(10, n - digits);
        }
        else
        {
            while (d < 0.1)
            {
                d = d * 10;
                n++;
            }
            d = Math.Round(d * Math.Pow(10, digits));
            d = d / Math.Pow(10, n + digits);
        }

        return d*neg;
    }


   private void testing()
   {
       double a = Rounding(1230435.34553,3);
       double b = Rounding(0.004567023523,4);
       double c = Rounding(-89032.5325,2);
       double d = Rounding(-0.123409,4);
       double e = Rounding(0.503522,1);
       Console.Write(a.ToString() + "\n" + b.ToString() + "\n" + 
           c.ToString() + "\n" + d.ToString() + "\n" + e.ToString() + "\n");
   }
1
Lucas925