📄 monthlypmt.sh
字号:
#!/bin/bash# monthlypmt.sh: Calculates monthly payment on a mortgage.# This is a modification of code in the#+ "mcalc" (mortgage calculator) package,#+ by Jeff Schmidt#+ and#+ Mendel Cooper (yours truly, the author of the ABS Guide).# http://www.ibiblio.org/pub/Linux/apps/financial/mcalc-1.6.tar.gz [15k]echoecho "Given the principal, interest rate, and term of a mortgage,"echo "calculate the monthly payment."bottom=1.0echoecho -n "Enter principal (no commas) "read principalecho -n "Enter interest rate (percent) " # If 12%, enter "12", not ".12".read interest_recho -n "Enter term (months) "read term interest_r=$(echo "scale=9; $interest_r/100.0" | bc) # Convert to decimal. # ^^^^^^^^^^^^^^^^^ Divide by 100. # "scale" determines how many decimal places. interest_rate=$(echo "scale=9; $interest_r/12 + 1.0" | bc) top=$(echo "scale=9; $principal*$interest_rate^$term" | bc) # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Standard formula for figuring interest. echo; echo "Please be patient. This may take a while." let "months = $term - 1"# ==================================================================== for ((x=$months; x > 0; x--)) do bot=$(echo "scale=9; $interest_rate^$x" | bc) bottom=$(echo "scale=9; $bottom+$bot" | bc)# bottom = $(($bottom + $bot")) done# ==================================================================== # -------------------------------------------------------------------- # Rick Boivie pointed out a more efficient implementation#+ of the above loop, which decreases computation time by 2/3.# for ((x=1; x <= $months; x++))# do# bottom=$(echo "scale=9; $bottom * $interest_rate + 1" | bc)# done# And then he came up with an even more efficient alternative,#+ one that cuts down the run time by about 95%!# bottom=`{# echo "scale=9; bottom=$bottom; interest_rate=$interest_rate"# for ((x=1; x <= $months; x++))# do# echo 'bottom = bottom * interest_rate + 1'# done# echo 'bottom'# } | bc` # Embeds a 'for loop' within command substitution.# --------------------------------------------------------------------------# On the other hand, Frank Wang suggests:# bottom=$(echo "scale=9; ($interest_rate^$term-1)/($interest_rate-1)" | bc)# Because . . .# The algorithm behind the loop#+ is actually a sum of geometric proportion series.# The sum formula is e0(1-q^n)/(1-q),#+ where e0 is the first element and q=e(n+1)/e(n)#+ and n is the number of elements.# -------------------------------------------------------------------------- # let "payment = $top/$bottom" payment=$(echo "scale=2; $top/$bottom" | bc) # Use two decimal places for dollars and cents. echo echo "monthly payment = \$$payment" # Echo a dollar sign in front of amount. echo exit 0 # Exercises: # 1) Filter input to permit commas in principal amount. # 2) Filter input to permit interest to be entered as percent or decimal. # 3) If you are really ambitious, #+ expand this script to print complete amortization tables.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -