blob: 0147c3ab36c3b56c88b5e3f3c90b4830652b87fc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* 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 ""
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.console().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
}