#!/usr/bin/perl use Math::BigFloat; $principal=shift; $interest=shift; $years=shift; $number_of_payments_per_year=shift; $month=shift; $year=shift; if (! $principal) {$principal = 211000} if (! $interest) {$interest = 5} if (! $years) {$years = 15} if (! $number_of_payments_per_year) {$number_of_payments_per_year = 12} if (! $month) {$month="SEP"} if (! $year) {$year=2003} $number_of_payments_per_year = 12; $total_number_of_payments = $years * $number_of_payments_per_year; # Real, not percent. E.G. if $interest=6 (ie 6%), then $interest_per_pay_period=0.005 $interest_per_pay_period = Math::BigFloat->new($interest); $interest_per_pay_period /= 100*$number_of_payments_per_year; # print "Rick, \$interest_per_pay_period=$interest_per_pay_period\n"; $total_number_of_payments=$years*$number_of_payments_per_year; $magic_number = Math::BigFloat->new('1'); for (1 .. $total_number_of_payments) {$magic_number*=(1+$interest_per_pay_period)} $foo1=Math::BigFloat->new($magic_number-1); $foo1/=$magic_number; $foo2=Math::BigFloat->new($principal); $foo2*=$interest_per_pay_period; $foo2/=$foo1; # print "raw payment=$foo2\n"; # $foo2=($principal * $interest_per_pay_period / (($magic_number-1)/$magic_number));print "raw payment=$foo\n"; $monthly_payment = sprintf("%.2f",(0.006 + $principal * $interest_per_pay_period / (($magic_number-1)/$magic_number))); # print "Rick, \$monthly_payment=$monthly_payment\n"; $printable_interest = $interest/100; $printable_month = 'SEP'; # When I got the loan. $year = 2003; %next_month = (JAN=>"FEB", FEB=>"MAR", MAR=>"APR", APR=>"MAY", MAY=>"JUN", JUN=>"JUL", JUL=>"AUG", AUG=>"SEP", SEP=>"OCT", OCT=>"NOV", NOV=>"DEC", DEC=>"JAN"); $payment_number = 0; $interest_for_year = 0; $years_this_page = 0; print "\$$principal \@ $interest% interest for $years years ($monthly_payment monthly payments)\n\n"; for (1 .. $total_number_of_payments) { $payment_number++; if ($payment_number == 1 || ($month eq 'JAN' && $years_this_page == 5)) { print " PAYMENT INTEREST PRINCIPAL NEW YEAR'S\n"; print " NUMBER MONTH YEAR PAYMENT PAYMENT PRINCIPAL INTEREST\n"; print " ------- ----- ---- -------- --------- --------- --------\n"; $years_this_page = 0; } $i = $principal * $interest_per_pay_period; $ii = sprintf("%.2f",$i); if ($ii - $i == .005) {$interest_payment = $ii - .01} else {$interest_payment = $ii} $interest_for_year += $interest_payment; if ($monthly_payment > $interest_payment + $principal) { $principal_payment = $principal; } else { $principal_payment = $monthly_payment - $interest_payment; } $principal-=$principal_payment; if ($month eq 'JAN' || $month eq 'DEC' || $payment_number == 1) { $pm = "$month $year "; } else { $pm = "$month "; } $line = sprintf("%6s $pm %7.2f %10.2f %10.2f",$payment_number, $interest_payment, $principal_payment, $principal); if ($month eq 'DEC' || $principal == 0) { printf("$line %9.2f\n\n",$interest_for_year); $interest_for_year = 0; } else { print "$line\n"; } $month = $next_month{$month}; if ($month eq 'JAN') { $year++; $years_this_page++; } if ($principal == 0) {exit} }