それはメソッドとして存在している場合、私は、そのような丸めのために使用して、いくつかのMath
を見つけようとしている:あなたの例に基づいて数学丸め方法
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
それはメソッドとして存在している場合、私は、そのような丸めのために使用して、いくつかのMath
を見つけようとしている:あなたの例に基づいて数学丸め方法
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
は、あなたがしたいラウンドに最も近い100まで、あなたがこれを行うことができます。
int x = 3219; // or any other input
int result = (x+99)/100*100;
このアルゴリズムの利点は、整数の世界であなたのその滞在です。これは、丸め誤差がないことを意味します(サブ結果を整数で表すことができる限り、問題ありません)。
あなたが一般化することができますのように、この方法:n
の数はどのあなたが切り上げしたいです
。
@wenstonの回答に基づいて、整数オーバーフローから以下を被っbranchfreeアルゴリズム構築することができます。
public static int RoundUp(this int x, int n = 100) {
int r = x % n;
return x + (n - r) % n;
}
これは拡張メソッドにすることができます。 –
@KfirGuy:それは素晴らしい考えです。完了しました。 –
整数オーバフローに悩まされています。 '2147483000!= RoundUp(2147482999、1000)' – weston
使用この:と整数オーバーフローの問題を防止するために
var value = 1234;
var result = (int)(Math.Ceiling(value/100f)*100);
を中間結果(例:RoundUp(2147482999, 1000)
)除算前にn
〜x
を追加しないでください。
public static int RoundUp(int x, int n) {
var r = x % n;
if (r == 0) return x;
return x + n - r;
}
x % n
は除算の残りの部分です。これがゼロでない場合は、[1..n]
の範囲にあるこの補数(n - x % n
)を追加する必要があります。 == n
の場合、実際にはゼロを追加したいので、別の% n
としてWillem pointed outとすると、ブランチレスになりますが、1つではなく2つの改行が行われます。
public static int RoundUp(int x, int n) {
return x + (n - x % n) % n;
}
そして、ちょうどリマインダー、あなたが本当にこれ以上の整数オーバーフローを心配している場合、あなたはchecked
ブロックにラップすることができます:
public static int RoundUp(int x, int n) {
checked
{
return x + (n - x % n) % n;
}
}
だから、最も近い100に切り上げしたいですか? –
100で除算して100を掛けます。 –
100で除算すると0.5を加算し、100を掛けます。 –