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