2017-04-06 8 views
-1

それはメソッドとして存在している場合、私は、そのような丸めのために使用して、いくつかの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 
+0

だから、最も近い100に切り上げしたいですか? –

+0

100で除算して100を掛けます。 –

+0

100で除算すると0.5を加算し、100を掛けます。 –

答えて

3

は、あなたがしたいラウンドに最も近い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; 
} 
+0

これは拡張メソッドにすることができます。 –

+0

@KfirGuy:それは素晴らしい考えです。完了しました。 –

+0

整数オーバフローに悩まされています。 '2147483000!= RoundUp(2147482999、1000)' – weston

2

使用この:と整数オーバーフローの問題を防止するために

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

を中間結果(例:RoundUp(2147482999, 1000))除算前にnxを追加しないでください。

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; 
    } 
} 
関連する問題