最も近い10の間隔に値を丸める.Netアルゴリズムが組み込まれています

StackOverflow https://stackoverflow.com/questions/274439

  •  07-07-2019
  •  | 
  •  

質問

C#で値を10間隔に丸める方法は?たとえば、11を持っている場合、136を持っている場合、10を返します。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フレームワークの古いバージョンに対してプログラミングしている場合は、「this」を削除してください。 RoundOff関数から、次のように関数を呼び出します。

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);

モジュラス(%)は残りを取得するため、次のようになります:

// 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を使用するための最初の本能で行ったはずです

UPCチェックディジットを計算する際にこれについてブログを書いた

これは少し遅すぎるかもしれませんが、いつかは役立つかもしれません...

これを試しました:

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()、はるかに優れたソリューションを既に述べています。

古い質問ですが、ここで質問されたことを行う方法に加えて、任意の数字を必要なsigイチジクの数に丸められるように拡張しました。

    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;

この方法と他の方法でパフォーマンステストを実行したことはありませんが、ビットバージョンのシフトとローテーションを回避するために、これを行うのが最も速い方法であるに違いありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top