int total = (int) Math.ceil(157/32);
Why does it still return 4?
157/32 = 4.90625, I need to round up, I’ve looked around and this seems to be the right method.
doubletype, but get 4.0.
What am I doing wrong?
You are doing
157/32which is dividing two integers with each other, which always result in a rounded down integer. Therefore the
(int) Math.ceil(...)isn’t doing anything. There are three possible solutions to achieve what you want. I recommend using either option 1 or option 2. Please do NOT use option 0.
bto a double, and you can use the division and
Math.ceilas you wanted it to work. However I strongly discourage the use of this approach, because double division can be imprecise.
int n = (int) Math.ceil((double) a / b));
int n = a / b + (a % b == 0) ? 0 : 1;
a / bwith always floor if
bare both integers. Then you have an inline if-statement witch checks whether or not you should ceil instead of floor. So +1 or +0, if there is a remainder with the division you need +1.
a % b == 0checks for the remainder.
This option is very short, but maybe for some less intuitive. I think this less intuitive approach would be faster than the double division and comparison approach:
int n = (a + b - 1) / b;
To reduce the chance of overflow you could use the following. However please note that it doesn’t work for
a = 0and
b > 1.
int n = (a - 1) / b + 1;
Explanation behind the “less intuitive approach”
Since dividing two integer in Java (and most other programming languages) will always floor the result. So:
int a, b; int result = a/b (is the same as floor(a/b) )
But we don’t want
ceil(a/b), and using the definitions and plots from Wikipedia:
With these plots of the floor and ceil function you can see the relationship.
You can see that
floor(x) <= ceil(x). We need
floor(x + s) = ceil(x). So we need to find
s. If we take
1/2 <= s < 1it will be just right (try some numbers and you will see it does, I find it hard myself to prove this). And `1/2 <= (b-1) / b < 1, so
ceil(a/b) = floor(a/b + s) = floor(a/b + (b-1)/b) = floor( (a+b-1)/b) )
This is not a real proof, but I hope your are satisfied with it. If someone can explain it better I would appreciate it too. Maybe ask it on MathOverflow.