どのように、C#で任意の値を10間隔に丸めますか?たとえば、11の場合は10を返し、136の場合は140を返します。
手で簡単にできます
return ((int)(number / 10)) * 10;
しかし、私はこの仕事をするための組み込みアルゴリズム、Math.Round()のようなものを探しています。手作業でやりたくない理由は、上記のような単純なものであっても、プロジェクト全体で同じまたは類似のコードを書きたくないからです。
クラス ライブラリには、これを行う組み込み関数はありません。最も近いのはSystem.Math.Round()で、これは Decimal および Double 型の数値を最も近い整数値に丸めるためだけのものです。ただし、.NET 3.5 を使用している場合は、ステートメントを拡張メソッドでラップすることができます。これにより、関数をよりクリーンに使用できます。
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
古いバージョンの .NET フレームワークに対してプログラミングしている場合は、RoundOff 関数から "this" を削除して、次のように関数を呼び出します。
int roundedNumber = ExtensionMethods.RoundOff(236); // returns 240
int roundedNumber2 = ExtensionMethods.RoundOff(11); // returns 10
Math.Ceilingを使用して、常に切り上げます。
int number = 236;
number = (int)(Math.Ceiling(number / 10.0d) * 10);
Modulus(%)は余りを取得するため、次のようになります。
// number = 236 + 10 - 6
それを拡張メソッドに入れます
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();
上記の編集:Math.Ceilingを使用する最初の本能で行くべきでした
これは少し遅すぎるかもしれませんが、いつかこれが役立つかもしれないと思います...
私はこれを試しました:
public int RoundOff(int number, int interval){
int remainder = number % interval;
number += (remainder < interval / 2) ? -remainder : (interval - remainder);
return number;
}
使用するには:
int number = 11;
int roundednumber = RoundOff(number, 10);
このように、間隔の半分を切り上げるか切り下げるかを選択できます。=)
浮動小数点数を整数に丸めるのは、単純にxをキャストするのとは対照的に、(int)(x + 0.5)に似ています。10の倍数が必要な場合は、それを簡単に適応させることができます。
整数演算を実行したいだけで、それを10に丸める場合は、(x + 10/2)/ 10*10を試してください。
編集:この応答は元の作成者の要求を満たしていないことに気付きました。また、偏った形式の丸めであり、私はしたくないのです。ただし、別の受け入れられた応答は、はるかに優れたソリューションであるMath.round()をすでに述べています。
古い質問ですが、これは尋ねられたことを行う方法です。さらに、任意の数を必要なシグフィグの数に丸めることができるように拡張しました。
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");
}
私はライブラリを持ち込むことMath
も浮動小数点に行くことも好まないので、以下のように整数演算を行い、次の 1K に切り上げることをお勧めします。繰り返したくない場合は、メソッドまたはラムダ スニペットなどでラップします。
int MyRoundedUp1024Int = ((lSomeInteger + 1023) / 1024) * 1024;
これと他の方法でパフォーマンステストを実行したことはありませんが、これがおそらくこれのビットバージョンのシフトとローテーションを除いて、これを行う最速の方法であるに違いありません。