この方法で丸めを行う Java 関数または util クラスはありますか?関数(3/2) = 2?

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

  •  21-08-2019
  •  | 
  •  

質問

Java関数またはユーティリティはありますか class これは次のように丸めます。 func(3/2) = 2

Math.ceil() 役に立たない、名前からしてそうすべきだった。気がついた BigDecimal, 、しかし、それは必要ありません。

役に立ちましたか?

解決

Math.ceil() 常に切り上げられますが、整数の除算を行っています 3/2. 。したがって、整数の除算では 3/2 = 1 (ない 1.5)の天井 11.

望む結果を達成するために必要なことは、 Math.ceil(3/2.0);

2 倍の量で除算を行うと (2.0)、整数の除算ではなく浮動小数点の除算を行うことになります。したがって 3/2.0 = 1.5, 、 そしてその ceil()1.5 いつも 2.

他のヒント

ちょっとした黒魔術で、すべて整数を使って行うことができます。

// Divide x by n rounding up
int res = (x+n-1)/n

いつでも最初にキャストできます。

Math.ceil((double)3/2)

床分割を天井分割に変換するには:

(numerator + denominator-1) / denominator

フロア分割を四捨五入分割に変換するには:

(numerator + (denominator)/2) / denominator

Java では、整数の除算を使用するため、3/2 = 1 となります。これを後で「修正」できる機能はありません。あなたがしなければならないことは、float 除算を強制し、結果を切り上げることです。

int result = (int)Math.ceil( ((float)3) / ((float)2) );

これは整数の除算のよくあるケースではないでしょうか?いずれかの数値を浮動小数点型にキャストした後、Math.Ceil を試してください。

多くの言語はこのように「考える」。int を int に分割する場合は、int を取得する必要があります (つまり、切り捨てられ、結果として 1 が得られます)。

これが真実ではないことは誰もが知っていますが、それが仕組みです。それらを「騙して」、そのうちの 1 つを double にキャストしたり、double 表現を使用したりすることができます。 Math.ceil (3.0 / 2) または Math.ceil((double)3/2), 、 述べたように。

数学天井 意思 浮動小数点数を使用する場合に役立ちます。問題は、整数の割り算で 3/2 が 1 になることです。Math.ceil であれ他の関数であれ、値が関数に到達するまでに、値は単に 1 になります。末尾の小数部分は削除されます。

if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

整数の除算を利用して、必要なことを実行します。これを行う数学関数を知りませんが、独自の関数を作成してみてはいかがでしょうか?

以下のフラグメントは負の整数でも機能します。

public static int divRoundUp(int x, int n) {
    if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")");
    int ret = (x+(n-1)*(x>0?1:0))/n;
    return ret;
}

私はランディ・プロクターの答えが一番好きです。さらに詳しくは次のとおりです。

実際の丸めを行いたい場合 (つまり、3/2 -> 2、ただし 17 / 7 -> 2) > 0 の整数の場合:使用 (dividend + (divisor / 2)) / divisor の代わりに dividend / divisor.

被除数が任意の整数である場合 (つまり、負の値は許可されます):(dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor).

被除数が任意の整数で、除数が 0 以外の整数の場合:(dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor).

(加算と減算を行うと、本来発生しないラップアラウンドが発生し、結果が不正確になる可能性があることに注意してください。)

これは、Math Round や float へのキャストを使用せずに int 除算を処理するために作成したメソッドです。これは正の数にも負の数にも機能します。分母の半分を加算して切り捨てを相殺することで機能します。

public static int div_Int(int num, int den){
    if(num > 0 && den > 0 || num < 0 && den < 0 ){
        return ((2*num)+ den)/(2*den);  
    }else{
        return ((2*num)- den)/(2*den);
    }

}

単純に 2 で割る場合は、次のようにします。

n - n / 2

そして一般的に:

(n - 1) / d + 1 == (n + d - 1) / d

これは、負でない整数にも当てはまります。これを負の整数に拡張する方法は、「この方法で丸めます」が何を意味するかによって異なります。整数の除算はゼロに向かって丸められますが、 Math.ceil() 切り上げて、 Math.floor() 切り捨てます。例えば n / 2 != (int) Math.floor(n / 2.0) のために n == -5.

常に切り上げたい場合は、次を使用できます Math.ceil() のように この答え.

本当に ceil と Casting の使用を避けたい場合は、同じことを実現する小さな方法を次に示します。

public int findCeil(int X, int Y) {
        if (X % Y == 0){
            return X / Y;
        } else {
            return X / Y + 1;
        }
    }

やってみました Math.floor() ?

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