Frage

Wie man in C # Runde einen beliebigen Wert bis 10 Intervall? wenn ich 11 habe zum Beispiel, ich will es 10 zurückkehren, wenn ich 136 habe, dann will ich es 140 zurück

Das kann ich es leicht von Hand

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

Aber ich bin für einen eingebauten Algorithmus diesen Job zu machen, so etwas wie Math.Round (). Der Grund, warum ich nicht von Hand tun möchte, ist, dass ich nicht gleich oder ähnlich Stück Code für etwas so Einfaches wie die vor allem über meine Projekte, auch schreiben wollen.

War es hilfreich?

Lösung

Es gibt keine integrierte Funktion in der Klassenbibliothek, die dies tun wird. Der nächste ist System.Math.Round () die ist nur für Zahlen von Typen Dezimal und doppelt auf den nächsten ganzzahligen Wert gerundet wird. Allerdings können Sie Ihre Aussage oben in einer Erweiterungsmethode wickeln, wenn Sie mit .NET 3.5 arbeiten, mit dem Ihnen die Funktion viel sauberer verwenden kann.

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

Wenn Sie die Programmierung gegen eine ältere Version des .NET-Frameworks, entfernen Sie einfach die „this“ von der Abrundungsfunktion, und rufen Sie die Funktion wie folgt:

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

Andere Tipps

Mit Math.Ceiling immer aufrunden.

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

Modul (%) bekommt den Rest, so erhalten Sie:

// number = 236 + 10 - 6

Setzen Sie, dass in eine Erweiterungsmethode

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();

oben bearbeitet: Ich mit meinem ersten Instinkt weg verwenden Math.Ceiling haben sollte

darüber gebloggt bei der Berechnung der UPC Prüfziffern .

Dies könnte ein wenig zu spät sein, aber ich denke, das ein Tag der guten Hilfe sein könnte ...

Ich habe versucht, dies:

public int RoundOff(int number, int interval){
    int remainder = number % interval;
    number += (remainder < interval / 2) ? -remainder : (interval - remainder);
    return number;
}

So verwenden:

int number = 11;
int roundednumber = RoundOff(number, 10);

Auf diese Weise haben Sie die Möglichkeit, ob, wenn die Hälfte des Intervalls wird abgerundet oder abgerundet. =)

einen Schwimmer auf eine ganze Zahl Rundung ist ähnlich (int) (x + 0,5), im Gegensatz zu einfach x Casting -., Wenn Sie ein Vielfaches von 10 möchten, können Sie leicht, dass anpassen

Wenn Sie nur ganzzahlige Mathematik tun wollen und runden es zehn, versucht (x + 10/2) / 10 * 10.

Edit: Ich habe bemerkt, dass diese Antwort nicht den ursprünglichen Verfasser Wunsch nicht erfüllt, und ist auch eine vorgespannte Form der Rundung, dass ich nicht zu bevorzugen. Allerdings erklärte eine andere akzeptierte Antwort bereits Math.round (), eine viel bessere Lösung.

Alte Frage, aber hier ist ein Weg, zu tun, was gefragt wurde und ich verlängerte es eine beliebige Anzahl auf die Anzahl der sig Feigen abrunden zu können, die Sie wollen.

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

Ich möchte nicht in der Math Bibliothek bringen, noch zu Floating-Point gehen so mein Vorschlag, wie unten nur tun Integer-Arithmetik ist, wo ich auf die nächste 1K aufrunden. Wickeln Sie es in einem Verfahren oder Lambda-Schnipsel oder etwas, wenn Sie nicht wiederholen möchten.

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

Ich habe keine Performance-Tests auf dies im Vergleich zu anderen laufe die Möglichkeiten, aber ich würde wetten, dass es der schnellste Weg ist dies vielleicht eine Verschiebung zu tun speichern und Drehen von Bits Version dieses.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top