999999998.9999999994
is not exactly representable in double
, so the actual value is one of the two representable numbers on either side of 999999998.9999999994
- either 999999998.99999988079071044921875
or 999999999
(assuming IEEE-754 binary64
format), selected in an implementation-defined manner. Most systems will by default round to nearest, producing 999999999
.
The net result is that on those systems when you write 999999998.9999999994
it ends up having the exact same effect as writing 999999999.0
. Hence the subsequent conversion yields 999999999
- the conversion from a floating point number to an integer always truncates, but here there is nothing to truncate.
With 999999998.9999994994
, the closest representable numbers are 999999998.999999523162841796875
and 999999998.99999940395355224609375
. Either one produces 999999998
after truncation. Similarly, with 8.9999999994
, the closest representable numbers are 8.999999999399999950355777400545775890350341796875
and 8.9999999994000017267126168007962405681610107421875
, and either one will produce 8
after truncation.