int total = (int) Math.ceil(157/32);
まだ4を返すのはなぜですか? 157/32 = 4.90625
、切り上げる必要があります。見回しましたが、これが正しい方法のようです。
total
タイプとしてdouble
を試しましたが、4.0を取得しました。
私は何を間違えていますか?
2つの整数を互いに分割する157/32
を実行しているため、常に切り捨てられた整数になります。したがって、(int) Math.ceil(...)
は何もしていません。あなたが望むものを達成するための3つの可能な解決策があります。 Irecommendoption 1またはオプション2。してくださいNOTuseoption 0.
a
とb
をdoubleに変換すると、除算とMath.ceil
を使用したいときに使用できます。ただし、二重分割は不正確になる可能性があるため、このアプローチの使用は強くお勧めしません。 doubleの不正確さについて詳しくは、 この質問 を参照してください。
int n = (int) Math.ceil((double) a / b));
int n = a / b + ((a % b == 0) ? 0 : 1);
a
とb
が両方とも整数である場合、常にフロアでa / b
を実行します。次に、インラインifステートメントの魔女が、フロアの代わりに天井を置くべきかどうかをチェックします。 +1または+0です。除算に余りがある場合は、+ 1が必要です。 a % b == 0
は残りをチェックします。
このオプションは非常に短いですが、いくつかの直感的でない可能性があります。この直感的ではないアプローチは、二重除算および比較アプローチよりも速いと思います。
int n = (a + b - 1) / b;
オーバーフローの可能性を減らすには、次を使用できます。ただし、a = 0
およびb < 1
では機能しないことに注意してください。
int n = (a - 1) / b + 1;
Java(および他のほとんどのプログラミング言語)で2つの整数を除算すると、常に結果がフロアリングされます。そう:
int a, b;
int result = a/b (is the same as floor(a/b) )
しかし、floor(a/b)
ではなくceil(a/b)
を必要とせず、 Wikipedia の定義とプロットを使用します。
床と天井関数のこれらのプロットを使用すると、関係を確認できます。
floor(x) <= ceil(x)
を見ることができます。 floor(x + s) = ceil(x)
が必要です。したがって、s
を見つける必要があります。 1/2 <= s < 1
を使用する場合は適切です(いくつかの数字を試してみてください。実際に表示されるので、これを証明するのは難しいと思います)。そして1/2 <= (b-1) / b < 1
ceil(a/b) = floor(a/b + s)
= floor(a/b + (b-1)/b)
= floor( (a+b-1)/b) )
これは本当の証拠ではありませんが、皆さんが満足していることを願っています。誰かがそれをもっとうまく説明できれば、私も感謝します。多分 MathOverflow で聞いてください。
157/32はint/int
であり、int
になります。
ダブルリテラル-157/32d
を使用してみてください。これはint/double
で、結果はdouble
になります。
157/32
は整数の除算です。数値リテラルはすべて、特に接尾辞(_の場合はd
、長い場合はl
)を指定しない限り整数であるためです。
除算は、倍数(4.0)に変換される前に切り下げられ(4に)、その後、切り上げられます(4.0に)
変数を使用すると、それを回避できます
double a1=157;
double a2=32;
int total = (int) Math.ceil(a1/a2);
int total = (int) Math.ceil((double)157/32);
Javaでは、.0を追加すると二重になります...
int total = (int) Math.ceil(157.0 / 32.0);
2つの整数を除算する場合、たとえば
int c = (int) a / (int) b;
結果はint
になり、その値はa
をb
で除算し、ゼロに丸められます。結果はすでに丸められているため、ceil()
は何もしません。この丸めは、負の無限大に丸めるfloor()
と同じではないことに注意してください。したがって、3/2
は1
と等しい(およびfloor(1.5)
は1.0
と等しいが、(-3)/2
は-1
と等しい(ただしfloor(-1.5)
は-2.0
と等しい)。
これは、a/b
が常にfloor(a / (double) b)
と同じである場合、a/b
のceil()
を-( (-a) / b)
として実装できるため、重要です。
からceil(a/b)
を取得する提案
int n = (a + b - 1) / b;
、a / b + (b - 1) / b
、または(a - 1) / b + 1
と同等
a/b
が整数の場合を除き、ceil(a/b)
は常にfloor(a/b)
よりも1大きいため、機能します。したがって、a/b
が整数でない限り、次の整数に(または過去に)バンプする必要があります。 1 - 1 / b
を追加すると、これが実行されます。整数の場合、次の整数までプッシュすることはできません。他のすべてについては、そうなります。
うわぁ。うまくいけば、それは理にかなっています。私はそれを説明するより数学的にエレガントな方法があると確信しています。
int total = (int) Math.ceil( (double)157/ (double) 32);
質問については、以下の解決策を確認してください。
int total = (int) Math.ceil(157/32);
ここでNumeratorに1.0を掛けると、答えが得られます。
int total = (int) Math.ceil(157*1.0/32);
最も直観的なものは誰も言及していません。
int x = (int) Math.round(Math.ceil((double) 157 / 32));
このソリューションはdouble除算の不正確さを修正します。
また、数値を整数から実数に変換するには、ドットを追加できます。
int total = (int) Math.ceil(157/32.);
また、(157/32。)の結果も実際になります。 ;)
Javaは、デフォルトでフロア分割/
のみを提供します。しかし、私たちは床に関して天井を書くができます。どれどれ:
整数y
は、y == q*k+r
という形式で記述できます。 floor
を四捨五入するフロア分割の定義(ここではr
)に従って、
floor(q*k+r, k) == q , where 0 ≤ r ≤ k-1
天井分割(ここではceil
)の端数はr₁
に切り上げられ、
ceil(q*k+r₁, k) == q+1 , where 1 ≤ r₁ ≤ k
r+1
をr₁
に置き換えることができます:
ceil(q*k+r+1, k) == q+1 , where 0 ≤ r ≤ k-1
次に、最初の式をq
取得の3番目に代入します
ceil(q*k+r+1, k) == floor(q*k+r, k) + 1 , where 0 ≤ r ≤ k-1
最後に、任意の整数y
を指定します。ここで、いくつかのq
、k
、r
のy = q*k+r+1
は、
ceil(y, k) == floor(y-1, k) + 1
これで完了です。お役に立てれば。
Doubleを使用してキャストする
Math.ceil((double)value)
など
Math.ceil((double)value1/(double)value2);
Double値を切り上げるには2つの方法があります。
回答4.90625を4にしたい場合はMath.floorを使用し、回答4.90625を5にしたい場合はMath.ceilを使用できます
次のコードを参照できます。
public class TestClass {
public static void main(String[] args) {
int floorValue = (int) Math.floor((double)157 / 32);
int ceilValue = (int) Math.ceil((double)157 / 32);
System.out.println("Floor: "+floorValue);
System.out.println("Ceil: "+ceilValue);
}
}