fixed build console
[groovy.git] / src / examples / console / MortgageCalculator.groovy
blobe0c69c673b96d93f2e1304d3c3c0edb269da1ada
1 /**
2 * Mortgage Calculator
3 * @author: Jeremy Rayner
4 * based on algorithms by Jeff Louie, Dr W Carlini and Newton
5 */
7 println "__..::~~'''~~::..__"
8 println "Mortgage Calculator"
9 println "~~~~~~~~~~~~~~~~~~~"
10 println "Please input 3 of the 4 values in your mortgage calculation"
11 println "This program will then calculate the value you leave blank"
12 println ""
14 def variables = [
15 "Amount of mortgage" : 0.0,
16 "Annual interest rate (%)" : 0.0,
17 "Loan duration (months)" : 0.0,
18 "Monthly payments" : 0.0
21 for (entry in variables.entrySet()) {
22 print("${entry.key}:")
23 def userInput = System.in.readLine()
24 if ("" == userInput) {
25 valueToCalculate = entry.key
26 } else {
27 entry.value = userInput.toDouble()
31 println "$valueToCalculate = ${calculateValueOf(valueToCalculate)}"
37 def calculateValueOf(valueToCalculate) {
38 def result = 0
39 def principal = variables["Amount of mortgage"]
40 def interest = variables["Annual interest rate (%)"] / 1200
41 def months = variables["Loan duration (months)"]
42 def payment = variables["Monthly payments"]
44 switch (valueToCalculate) {
45 case "Amount of mortgage":
46 result = 1 + interest
47 result = 1/Math.pow(result,months)
48 result = ((1-result)/interest) * payment
49 break
50 case "Loan duration (months)":
51 result = (1 - (principal * interest / payment))
52 result = Math.log(result)
53 result = - result / Math.log(1 + interest)
54 break
55 case "Monthly payments":
56 result = 1 + interest
57 result = 1 / Math.pow(result,months)
58 result = (principal * interest) / (1 - result)
59 break
60 case "Annual interest rate (%)":
61 result = payment / principal
62 def diff = 100; def accuracy = 0.00001; def maxIterations = 1000
63 def index = 0
64 while ((diff > accuracy) && (index < maxIterations)) {
65 def temp = result
66 def numerator = (principal * temp / payment) + Math.pow((1 + temp), -months) - 1
67 def denominator= (principal / payment) - months * Math.pow((1 + temp), (-months - 1))
68 result = temp - (numerator / denominator)
69 diff = result - temp
70 diff = Math.abs(diff)
71 index++
73 result *= 1200
74 break
76 return result