### Question:

`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.I tried

`total`

as`double`

type, but get 4.0.What am I doing wrong?

### Answer:

You are doing

`157/32`

which 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. Irecommendusing eitheroption 1oroption 2. Please doNOTuseoption 0.

## Option 0

Convert

`a`

and`b`

to a double, and you can use the division and`Math.ceil`

as 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));`

## Option 1

`int n = a / b + (a % b == 0) ? 0 : 1;`

You do

`a / b`

with always floor if`a`

and`b`

are 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 == 0`

checks for the remainder.## Option 2

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 = 0`

and`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

`floor(a/b)`

, but`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 < 1`

it 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.

https://stackoverflow.com/questions/7139382/java-rounding-up-to-an-int-using-math-ceil