public static BigDecimal toScale(final BigDecimal number) { return toScale(number, DEFAULT_SCALE); }
public static BigDecimal toScale(final BigDecimal number) { return toScale(number, DEFAULT_SCALE); }
static BigDecimal feePaid(final BigDecimal originalValue, final BigDecimal interestRate, final int originalTerm, final BigDecimal annualFee, final int totalMonths) { final BigDecimal monthlyRate = divide(interestRate, 12); final BigDecimal monthlyFee = divide(annualFee, 12); final BigDecimal pmt = FinancialUtil.pmt(monthlyRate, originalTerm, originalValue); final BigDecimal result = IntStream.range(0, totalMonths) .mapToObj(term -> FinancialUtil.fv(monthlyRate, term + 1, pmt, originalValue).negate()) .map(fv -> times(fv, monthlyFee)) .reduce(BigDecimal.ZERO, BigDecimalCalculator::plus); LOGGER.debug("Fee paid from {} CZK at {} rate for {} months with {} annual fee over {} months is {} CZK.", originalValue, interestRate, originalTerm, annualFee, totalMonths, result.doubleValue()); return toScale(result); }
static BigDecimal feePaid(final BigDecimal originalValue, final BigDecimal interestRate, final int originalTerm, final BigDecimal annualFee, final int totalMonths) { final BigDecimal monthlyRate = divide(interestRate, 12); final BigDecimal monthlyFee = divide(annualFee, 12); final BigDecimal pmt = FinancialUtil.pmt(monthlyRate, originalTerm, originalValue); final BigDecimal result = IntStream.range(0, totalMonths) .mapToObj(term -> FinancialUtil.fv(monthlyRate, term + 1, pmt, originalValue).negate()) .map(fv -> times(fv, monthlyFee)) .reduce(BigDecimal.ZERO, BigDecimalCalculator::plus); LOGGER.debug("Fee paid from {} CZK at {} rate for {} months with {} annual fee over {} months is {} CZK.", originalValue, interestRate, originalTerm, annualFee, totalMonths, result.doubleValue()); return toScale(result); }
@Test void scaling() { final BigDecimal result = BigDecimalCalculator.toScale(BigDecimal.ZERO); assertThat(result.scale()).isEqualTo(BigDecimalCalculator.DEFAULT_SCALE); } }