An int represents an exact number. A float, on the other hand, does not. In binary, 111111111 is 110100111110110101111000111. This is a 27-bit number. But the float type only offers 24 bits of precision. That means that 111111111 can't actually be represented precisely in a float, and so it will be rounded to the nearest exactly-representable value. 111111112 is 110100111110110101111001000 in binary; the low-order three bits are zero, so you only need 24 bits to represent it exactly. So when you store 111111111 (or 111111113, or 111111115, or any other nearby value) in a float, 111111112 is the value that will actually be stored. When you convert back to an int, the original value has been forgotten, and you get the stored value instead.
Here are some details from the
Java Language Specification.