2017-04-06 3 views
-1

Ich versuche, einige Math mit für eine solche Rundung zu finden, wenn es vorhanden ist als Methode ist:Math Rundungsmethode

3219 to 3300 
11380 to 11400 
12583 to 12600 
8275 to 8300 
1778 to 1800 
399 to 400 
340 to 400 
305 to 400 
266 to 300 
123 to 200 
32 to 100 
3 to 100 
1 to 100 
+0

So möchten Sie auf den nächsten 100 abzurunden? –

+0

Dividieren von 100, machen Runden, multiplizieren mit 100. –

+0

dividieren durch 100, fügen Sie 0,5, rund, multiplizieren mit 100 –

Antwort

3

Basierend auf Ihrem Beispiel Sie Runde wollen bis zu den nächsten 100, Sie können dies tun, mit:

int x = 3219; // or any other input 
int result = (x+99)/100*100; 

der Vorteil dieses Algorithmus ist, dass Sie Aufenthalt in der integer-Welt. So bedeutet das, dass es keine Rundungsfehler (und solange die subresult als eine ganze Zahl dargestellt werden können), wir sind in Ordnung.

können Sie verallgemeinern diese Methode wie:

Wo n ist die Nummer, an die Sie aufrunden wollen.

Basierend auf @wenston s Antwort, können Sie einen branchfree Algorithmus konstruieren, die weniger von Integer-Überlauf leidet:

public static int RoundUp(this int x, int n = 100) { 
    int r = x % n; 
    return x + (n - r) % n; 
} 
+0

Sie können dies zu einer Erweiterungsmethode machen. –

+0

@KfirGuy: Das ist eine großartige Idee. Erledigt. –

+0

Leiden von Integer-Überlauf z.B. '2147483000 = Roundup (2147482999, 1000)' – weston

2

verwenden:

var value = 1234; 
var result = (int)(Math.Ceiling(value/100f)*100); 
2

Um Integer-Überlauf Probleme zu verhindern, mit Zwischenergebnisse (zB RoundUp(2147482999, 1000)) sollten wir n-x vor der Spaltung nicht hinzufügen:

public static int RoundUp(int x, int n) { 
    var r = x % n; 
    if (r == 0) return x; 
    return x + n - r; 
} 

x % n ist der Rest einer Kluft. Wenn dies nicht Null ist, müssen wir das Kompliment dieser (n - x % n), die im Bereich [1..n] ist hinzuzufügen. Wenn es == n ist, wollen wir eigentlich, dass es Null hinzufügen, so können wir dies durch eine andere % n als Willem pointed out erreichen, die es verzweigt macht, aber mit zwei Mods anstelle von einem.

public static int RoundUp(int x, int n) { 
    return x + (n - x % n) % n; 
} 

Und nur eine Erinnerung, wenn Sie wirklich über Integer-Überlauf darüber hinaus kümmern, dann können Sie in einem checked Block wickeln:

public static int RoundUp(int x, int n) { 
    checked 
    { 
     return x + (n - x % n) % n; 
    } 
}