When the numeral “.01” is converted to 64-bit IEEE 754 binary floating point, the result is 0.010000000000000000208166817117216851329430937767028809. When $r is set to 0, and this approximation of .01 is added to it 100 times, the result is 1.0000000000000006661338147750939242541790008544921875, due to additional rounding errors during the additions.
Now consider that $r is further incremented from this value slightly over 1, while $o is incremented from its starting value of exactly 1. First, since $r and $o start with different values, they will generally have different values later. Second, because they are different, as the increment is added to each of them, they encounter different errors from rounding in the additions. This errors can happen to reinforce or to cancel, causing $r or $o to be more or less different.
Finally, PHP has some criterion for deciding whether to print a number with two decimal points or more. Presumably, at some point the value of $r or of $o is sufficiently far away from the nearest numeral with two decimal points that PHP decides it should print more digits. As explained above, this happens at different times for $r and $o.