class
この方法で丸めを行うJava関数またはユーティリティはありますか: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
床の分割を天井の分割に変換するには:
(numerator + denominator-1) / denominator
フロア除算を丸め除算に変換するには:
(numerator + (denominator)/2) / denominator
いつでも最初にキャストできます:
Math.ceil((double)3/2)
Java では、整数除算を使用するため、3/2 = 1 です。後でこれを「修正」できる機能はありません。あなたがしなければならないことは、浮動小数点除算を強制し、結果を切り上げることです:
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)
、前述のように。
浮動小数点数を使用する場合、Math.ceilが役に立ちます。問題は、整数除算の 3/2 が 1 であることです。Math.ceil であれ、他の関数であれ、値が関数に到達するまでに、値は単純に 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;
}
if (a % b == 0)
{
return (a / b);
}
else
{
return (a / b) + 1;
}
整数除算を利用して、必要なことを行います。これを行う数学関数は知りませんが、独自の関数を作成してみませんか?
これは、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);
}
}
私はランディ・プロクターの答えが一番好きです。ここでより詳細に:
整数 > 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)
.
(加算と減算により、そうでなければ発生しないラップアラウンドが発生し、結果が正しくないことに注意してください。)
試しましたMath.floor()
か?