4

2 つの整数を除算し、結果として整数を取得しようとしています。正しいMath.Round()方法が必要なので、除算すると、方法に関係なく常に次の整数に丸められます。以下に、期待される例をいくつか示します。

int result = (6/4); // = 2
int result = (3/4);  // = 1
int result = (1/4);  // = 1
int result = (8/4);  // = 2
int result = (9/4);  // = 3

これを行う正しい方法は何ですか?

4

4 に答える 4

7

あなたの例のすべての整数は正であるため、一方または両方のオペランドが負またはゼロの場合には関心がないと仮定します。

Math.Round浮動小数点数で動作します。ここでは必要ありません。

2つの整数を除算すると、整数の結果が得られます。常に切り捨てられます。あなたはこのようなものが欲しいです:

int Divide(int numerator, int denominator) {
    return (numerator + denominator - 1) / denominator;
}

たとえば、の場合は1/4、を取得(1 + 4 - 1) / 4 = 4 / 4 = 1し、の場合8/4はを取得し(8 + 4 - 1) / 4 = 11 / 4 = 2ます。

ここではオーバーフローの可能性がごくわずかであるため、分子が常にゼロより大きい場合は、次を使用することをお勧めします。

int Divide(int numerator, int denominator) {
    return 1 + (numerator - 1) / denominator;
}
于 2013-02-26T22:37:13.997 に答える
4

float/double として除算を実行し、Math.Ceilingを使用する必要があります。

Math.Ceiling... 指定された倍精度浮動小数点数以上の最小の整数値を返します。

サンプル:

 int result = (int)Math.Ceiling(6/4.0);
 result = (int)Math.Ceiling((double)3/4);
于 2013-02-26T22:34:07.153 に答える
0

これらの整数の 1 つは、次のようにする必要がありますdouble

double result = (6d/4); // 1.5  
int rounded = (int)Math.Round(result, MidpointRounding.AwayFromZero);
于 2013-02-26T22:32:33.580 に答える
0

これは間違いなくあなたが探している方法ではありません...

int mod = 9 % 4;
int result = (9 - mod) / 4) + (mod > 0 ? 1 : 0);

Math クラスのキャストや使用は必要ありません。

于 2013-02-26T22:34:43.147 に答える