You're simply dealing with the immutable nature of floating point values.
In decimal form, what is 1/3?
It's 0.33333333333333333*** onto an infinite number of 3s. It's impossible to perfectly represent 1/3 in decimal format, so eventually you reach a point where you say, "It's close enough for my needs!" That might be 0.33, or 0.33333333, or 0.333333333333333333333, but at some point you just stop pasting on 3s and you call it "good enough".
The problem, however, comes when you start adding those decimal values together. Add your number three times and you get 0.99, 0.99999999, or 0.999999999999999999999, but you'll never exactly add up to one!
Rounding errors are just part of the nature of the beast, and you have to figure out how to deal with them.
One of the simplest ways, is to do like banks do: Eliminate decimals entirely! Your bank doesn't track your account as having $123.45 in it. They track it as you having 12,345 PENNIES in it! Integer values instead of decimal values, and it's only when displaying the amount that they convert down to decimals for the user. (Much like your second code box does.)
Another simple way, in this case, is to limit results via rounding, since you only want a single digit decimal value. Something like the following should work:
i = INT(10 * i + .5) /10
Another solution is to use PRINT USING to format the results to single decimal precision:
PRINT USING "###.#"; i
Those tend to be your basic 3 ways of dealing with the issue.
1) Convert to integers and don't deal with floating points at all.
2) Manually round to a lower level of precision than the variable type normally holds.
3) Format the print to account for the issue, without altering those floating point values.