Вы делаете 157/32
, который делит два целых числа друг с другом, что всегда приводит к округленному целому числу.Поэтому (int) Math.ceil(...)
ничего не делает.Есть три возможных решения для достижения того, что вы хотите.Я рекомендую , используя опция 1 или опция 2 .Пожалуйста, НЕ используйте параметр 0 .
Параметр 0
Преобразуйте a
и b
в двойные, и вы можете использоватьделение и Math.ceil
, как вы хотели, чтобы это работало.Однако я настоятельно не рекомендую использовать этот подход, потому что двойное деление может быть неточным.Чтобы узнать больше о неточности двойных чисел, см. этот вопрос .
int n = (int) Math.ceil((double) a / b));
Вариант 1
int n = a / b + ((a % b == 0) ? 0 : 1);
Вы делаете a / b
всегда с полем, если a
иb
оба являются целыми числами.Тогда у вас есть встроенный оператор if-Statement, который проверяет, стоит ли вам использовать ceil вместо пола.Так что +1 или +0, если есть остаток с делением, вам нужно +1.a % b == 0
проверяет остаток.
Вариант 2
Этот параметр очень короткий, но, возможно, для некоторых менее интуитивно понятен.Я думаю, что этот менее интуитивный подход будет быстрее, чем подход двойного деления и сравнения:
int n = (a + b - 1) / b;
Чтобы уменьшить вероятность переполнения, вы можете использовать следующее.Тем не менее, обратите внимание, что он не работает для a = 0
и b < 1
.
int n = (a - 1) / b + 1;
Объяснение "менее интуитивного подхода"
С делением двух целых чисел в Java (и большинстводругие языки программирования) всегда будет определять результат.Итак:
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 .