import java.text.DecimalFormat; import java.math.BigDecimal; import java.math.MathContext; import java.time.Month; import java.time.YearMonth; class Darlehenberechner { private static final class Konfiguration { private BigDecimal darlehenswert; private BigDecimal zinssatzProzent; private BigDecimal monatlicheRate; private Integer laufzeitJahre; private Integer tilgungsfreieZeit; private YearMonth anfangsmonat; public BigDecimal getDarlehenswert() { return darlehenswert; } public Konfiguration setDarlehenswert(BigDecimal darlehenswert) { this.darlehenswert = darlehenswert; return this; } public BigDecimal getZinssatzProzent() { return zinssatzProzent; } public Konfiguration setZinssatzProzent(BigDecimal zinssatzProzent) { this.zinssatzProzent = zinssatzProzent; return this; } public BigDecimal getMonatlicheRate() { return monatlicheRate; } public Konfiguration setMonatlicheRate(BigDecimal monatlicheRate) { this.monatlicheRate = monatlicheRate; return this; } public Integer getLaufzeitJahre() { return laufzeitJahre; } public Konfiguration setLaufzeitJahre(Integer laufzeitJahre) { this.laufzeitJahre = laufzeitJahre; return this; } public Integer getTilgungsfreieZeit() { return tilgungsfreieZeit; } public Konfiguration setTilgungsfreieZeit(Integer tilgungsfreieZeit) { this.tilgungsfreieZeit = tilgungsfreieZeit; return this; } public YearMonth getAnfangsmonat() { return anfangsmonat; } public Konfiguration setAnfangsmonat(YearMonth anfangsmonat) { this.anfangsmonat = anfangsmonat; return this; } } private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,##0.00"); private static final BigDecimal ZWOELF = BigDecimal.valueOf(12); public static void main(String[] args) { var konfig = new Konfiguration() .setDarlehenswert(BigDecimal.valueOf(168_000)) .setZinssatzProzent(BigDecimal.valueOf(3.73)) .setMonatlicheRate(BigDecimal.valueOf(1_500)) .setTilgungsfreieZeit(0) .setAnfangsmonat(YearMonth.of(2024, Month.SEPTEMBER)); berechneWerte(konfig); /*var konfig = new Konfiguration() .setDarlehenswert(BigDecimal.valueOf(168_000)) .setZinssatzProzent(BigDecimal.valueOf(3.73)) .setMonatlicheRate(BigDecimal.valueOf(1_500)) .setTilgungsfreieZeit(0) .setLaufzeitJahre(11) .setAnfangsmonat(YearMonth.of(2024, Month.SEPTEMBER)); berechneWerte(konfig);*/ } private static void berechneWerte(Konfiguration konfig) { BigDecimal zinssatzReal = konfig.getZinssatzProzent().divide(BigDecimal.valueOf(100), MathContext.DECIMAL128); BigDecimal monatlicheRate = konfig.getMonatlicheRate(); Integer laufzeitJahre = konfig.getLaufzeitJahre(); Integer tilgungsfreieZeit = konfig.getTilgungsfreieZeit(); BigDecimal restschuld = konfig.getDarlehenswert(); YearMonth aktuellerMonat = konfig.getAnfangsmonat(); BigDecimal summeZinsen = BigDecimal.ZERO; BigDecimal summeTilgung = BigDecimal.ZERO; int laufzeitMonate = 0; while ((laufzeitJahre == null || laufzeitMonate < (laufzeitJahre * 12)) && restschuld.signum() > 0) { // berechne Beträge/ aktualisiere Restschuld BigDecimal zinsbetrag = restschuld.multiply(zinssatzReal).divide(ZWOELF, MathContext.DECIMAL128); if (monatlicheRate.compareTo(restschuld) > 0) { monatlicheRate = restschuld.add(zinsbetrag); // die letzte Rate ist gleich der Restschuld + Zinsen } BigDecimal tilgungsbetrag = tilgungsfreieZeit != null && tilgungsfreieZeit > 0 ? BigDecimal.ZERO : monatlicheRate.subtract(zinsbetrag); restschuld = restschuld.subtract(tilgungsbetrag); System.out.println(aktuellerMonat + ": " + DECIMAL_FORMAT.format(monatlicheRate) + " = " + DECIMAL_FORMAT.format(zinsbetrag) + " + " + DECIMAL_FORMAT.format(tilgungsbetrag) + " | " + DECIMAL_FORMAT.format(restschuld)); // berechne Summen für Zusammenfassung summeZinsen = summeZinsen.add(zinsbetrag); summeTilgung = summeTilgung.add(tilgungsbetrag); if ((laufzeitMonate > 0 && laufzeitMonate % 11 == 0) || aktuellerMonat.getMonthValue() == 12) { System.out.println(" " + DECIMAL_FORMAT.format(summeZinsen) + " + " + DECIMAL_FORMAT.format(summeTilgung)); } // aktualisiere Werte für den nächsten Lauf aktuellerMonat = aktuellerMonat.plusMonths(1); laufzeitMonate++; if (tilgungsfreieZeit != null) { tilgungsfreieZeit--; } } // letzte Zusammenfassung System.out.println(" " + DECIMAL_FORMAT.format(summeZinsen) + " + " + DECIMAL_FORMAT.format(summeTilgung)); // Ausgabe Laufzeit + Restschuld laufzeitJahre = laufzeitJahre == null ? laufzeitMonate / 12 : laufzeitJahre; int laufzeitMonateTeil = laufzeitMonate - (laufzeitJahre * 12); System.out.println("Laufzeit: " + laufzeitJahre + " Jahre " + laufzeitMonateTeil + " Monate"); System.out.println("Restschuld: " + DECIMAL_FORMAT.format(restschuld)); } }