21

classこの方法で丸めを行うJava関数またはユーティリティはありますか:func(3/2) = 2

Math.ceil()名前でそうすべきだったのに、役に立ちません。私は知っていますがBigDecimal、それは必要ありません。

4

15 に答える 15

55

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

あなたが望む結果を達成するためにあなたがしなければならないことは、Math.ceil(3/2.0);

2 倍の量 ( 2.0) で除算を行うと、整数除算の代わりに浮動小数点除算を行うことになります。したがって3/2.0 = 1.5ceil()1.5は常に2です。

于 2009-07-02T13:09:18.590 に答える
49

少しの黒魔術で、すべて整数で実行できます。

// Divide x by n rounding up
int res = (x+n-1)/n
于 2009-07-02T13:11:28.790 に答える
14

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

(numerator + denominator-1) / denominator

フロア除算を丸め除算に変換するには:

(numerator + (denominator)/2) / denominator
于 2009-07-02T13:24:24.940 に答える
12

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

Math.ceil((double)3/2)
于 2009-07-02T13:08:19.077 に答える
5

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

int result = (int)Math.ceil( ((float)3) / ((float)2) );
于 2009-07-02T13:11:40.863 に答える
4

これは整数除算の通常のケースではありませんか? いずれかの数値を浮動小数点型にキャストした後、Math.Ceil を試してください。

于 2009-07-02T13:08:16.173 に答える
3

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

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

于 2009-07-02T13:12:07.120 に答える
2

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

于 2009-07-02T13:10:13.393 に答える
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;
}
于 2011-01-13T11:35:55.703 に答える
1
if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

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

于 2009-07-02T13:13:39.690 に答える
0

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

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

}
于 2013-05-13T00:25:11.403 に答える
0

私はランディ・プロクターの答えが一番好きです。ここでより詳細に:

整数 > 0 で実数の丸め (つまり、3/2 -> 2 ですが、17 / 7 -> 2) を実行する場合:(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).

(加算と減算により、そうでなければ発生しないラップアラウンドが発生し、結果が正しくないことに注意してください。)

于 2011-07-27T16:51:24.877 に答える
-4

試しましたMath.floor()か?

于 2009-07-02T13:11:38.087 に答える