Your expectation is simply wrong: it is supposed to move to the same day in the following month, if such exists. Anyway, how can the code know that you want Feb 28 to mean "the last day of February"? It legitimately means "the 28th day of February". Suppose you started with Jan 28, then added a month, then added one more, what result would you expect?
What you need can be achieved by working with the 1st of the following month and then moving one day back.