我是一个初学者,试图用Java创建一个小程序,该程序允许用户输入他们的贷款期限,利率等,并希望对每月还款额进行估算。但是,当我这样做时,它给我的数字与我手动计算的数字完全不同。
有人告诉我使用BigDecimal数学系统,因为原始的double数据类型不够精确,无法进行财务计算。
我正在执行的步骤正在尝试模仿此公式: M = P [i(1 + i)^ n / 1-(1 + i)^ n]
BigDecimal iRateInput = BigDecimal.valueOf(iRate);
BigDecimal twelve = new BigDecimal("12");
BigDecimal iRateMonthly = iRateInput.divide(twelve);
BigDecimal one = new BigDecimal ("1");
BigDecimal iRateTemp = iRateMonthly.add(one);
BigDecimal loanTermBD = BigDecimal.valueOf(loanTerm);
loanTermBD = loanTermBD.multiply(twelve);
BigDecimal iRatePower = iRateTemp.pow(loanTerm);
BigDecimal iRateTop = iRateMonthly.multiply(iRatePower);
BigDecimal iRateBottom = iRatePower.subtract(one);
BigDecimal iRateTotal = iRateTop.divide(iRateBottom, BigDecimal.ROUND_UP);
BigDecimal borrowAmountBD = BigDecimal.valueOf(borrowAmount);
BigDecimal repayments = borrowAmountBD.multiply(iRateTotal);
我一直在用以下代码测试此代码:
P = 100,000
n = 15年(* 12)
r = 0.06p / a
根据我的计算,每月还款额应为843.86 但我得到6936.43
我们将不胜感激! <3
答案 0 :(得分:1)
我不明白为什么您需要在这里使用BigDecimal
private static double calculateRatePower(double rate, int period) {
return Math.pow(1.0 + rate/12.0, period * 12.0);
}
public static void main(String[] args) throws IOException {
double iRate = 0.06;
double borrowAmount = 100000.0;
int loanTerm = 15;
double top = (iRate / 12.0) * calculateRatePower(iRate, loanTerm);
double bottom = 1 - calculateRatePower(iRate, loanTerm);
double repayments = borrowAmount * (top/bottom);
System.out.println(repayments);
}
运行此操作会产生
-843.8568280484624
如果您仍然想使用BigDecimal,建议您使用单独的方法做一些事情,以获得更易读的代码
private static BigDecimal ratePerMonth(double rate) {
return BigDecimal.valueOf(rate).divide(BigDecimal.valueOf(12), 20, RoundingMode.DOWN);
}
private static BigDecimal calculateRatePower(double rate, int period) {
BigDecimal onePlus = BigDecimal.ONE.add(ratePerMonth(rate));
return onePlus.pow(period * 12);
}
public static void main(String[] args) throws IOException {
double iRate = 0.06;
double borrowAmount = 100000.0;
int loanTerm = 15;
BigDecimal top = ratePerMonth(iRate).multiply(calculateRatePower(iRate, loanTerm));
BigDecimal bottom = BigDecimal.ONE.subtract(calculateRatePower(iRate, loanTerm));
BigDecimal ratio = top.divide(bottom, 20, RoundingMode.DOWN);
BigDecimal repayments = BigDecimal.valueOf(borrowAmount).multiply(ratio);
System.out.println(repayments);
}
产生
-843.856828048451310000000
答案 1 :(得分:-1)
简单的大十进制具有比十进制更大的精度,因为大十进制必须具有舍入模式,请尝试使用具有舍入值的构造函数。
但是BigDecimal为我们提供了准确的答案。 因此,请先尝试使用长整数和小数,然后先检查少量样本数据,然后确定问题出在哪儿。希望对您有帮助!