| /* |
| * 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 |
| } |