A 'month' is an abstract measurement of time. Sometimes it's 29 days, 30, or 31. You cannot say "I have 30 days, how many months is that?" because the answer is "it depends".
<date> - <date> gives you an interval in days. In your example, you took Jan 31 2016 and added "1 month". Postgres says "I know feb 2016 is 29 days" and did it automatically for you. When you then subtracted Jan 31 2016, you now have "29 days". Postgres can no longer say "that is 1 month" because you cannot go that direction.
You are also using extract(month from X) incorrectly if you want the number of months between any time period. That will only return a value between 0 and 11.
It will also be difficult because you are starting from a random day in the month, making it hard to really know what you mean. Postgres' age() function may be able to help you with 'months'.
flpg=# select age( '2016-02-01'::timestamp, '2016-01-01'::timestamp );
age
-------
1 mon
flpg=# select age( '2016-02-29'::timestamp, '2016-01-31'::timestamp );
age
---------
29 days
(1 row)
flpg=# select age( '2016-03-01'::timestamp, '2016-01-31'::timestamp );
age
-------------
1 mon 1 day