この方法で丸めを行う Java 関数または util クラスはありますか?関数(3/2) = 2?
質問
Java関数またはユーティリティはありますか class
これは次のように丸めます。 func(3/2) = 2
Math.ceil()
役に立たない、名前からしてそうすべきだった。気がついた BigDecimal
, 、しかし、それは必要ありません。
解決
Math.ceil()
常に切り上げられますが、整数の除算を行っています 3/2
. 。したがって、整数の除算では 3/2 = 1
(ない 1.5
)の天井 1
は 1
.
望む結果を達成するために必要なことは、 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()
?