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;
}
}
So möchten Sie auf den nächsten 100 abzurunden? –
Dividieren von 100, machen Runden, multiplizieren mit 100. –
dividieren durch 100, fügen Sie 0,5, rund, multiplizieren mit 100 –