For one thing, 1 - 0.999... = 0.000... because you never get to have any remainder since 0.999... is infinite.
Or here's another proof:
x = 0.999...
10x = 9.999...
10x - x = 9.999... - 0.999...
9x = 9.000... = 9
9x = 9
x = 1
9.999.. - 0.999 is 9 no matter how we define .999... just as long as two or more occurrences of the 0.999... notation all denote the same entity, and we understand that the syntax 9.999... is 9 + 0.999...
For example, if we define 0.999... as "rubber duck" then 9.999... stands for 9 + "rubber duck", and 9.999... - 0.999... stands for 9 + "rubber duck" - "rubber duck" = 9.
0.999... * 10 = 9.999...
Because "one less 9 than infinity is still infinity" it's what really closes the loop on the proof.
You can't represent 0.2 exactly using IEEE floats, either, but that doesn't mean the representation 0.2 is not exactly equal to 1/5th.