Ваша формула рассчитывает количество месяцев между первым месяцем полученной даты и первым месяцем срока платежа. Поскольку большинство элементов времени в TimeSpan выражается как TotalXXX, кажется странным, что они не учли TotalMonths и TotalYears.
Я думаю, это потому, что не существует фиксированного количества дней от месяца к месяцу, поэтому трудно понять, что имеет смысл с точки зрения выражения дробного остатка.
Моя формула такая ...
int nMonthDiff_FirstToFirst = DateTime.Now.Month - testDate.Month + ((DateTime.Now.Year - testDate.Year)* 12);
double dMonthDiff = (double)nMonthDiff_FirstToFirst + (DateTime.Now - testDate.AddMonths(nMonthDiff_FirstToFirst)).TotalDays / (double)DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
Так что я делаю, в основном, получаю разницу в месяце, как у вас (с первого по первый месяц), затем я проецирую свой testDate на будущее по разнице в месяце. Затем с этим TimeSpan я получаю TotalDays и делю это на количество дней в этом месяце. Таким образом, я представляю дробную часть с точки зрения оставшихся дней месяца.
Так что, если вы собираетесь отправиться 5 мая 2012 г. -> 3 июня 2012 г., ваша формула вернет 1 для разницы за месяц, когда еще не закончился целый месяц. В моей формуле TotalDays прогнозируемой даты будет давать отрицательное дробное число дней, а при добавлении к разнице «первый-первый» месяц будет принимать ее по мере необходимости.