如何用 JavaScript 计算每月汽车还款金额
数据阿明
结论
等额本息贷款应使用以下标准公式:
[ M = P \times \frac{r(1+r)^N}{(1+r)^N-1} ]
其中:
M:每月还款金额P:贷款本金(Amount Financed)r:月利率,即年利率除以 12N:总还款期数(Term,单位为月)
如果 APR 字段中的 0.21 表示年利率 21%,可以在 Adobe 表单计算字段中使用以下 JavaScript:
var R = Number(this.getField("APR").valueAsString);
var N = Number(this.getField("Term").valueAsString);
var P = Number(
this.getField("AmountFinanced").valueAsString.replace(/[$,\s]/g, "")
);
if (isNaN(R) || isNaN(N) || isNaN(P) || N <= 0 || P < 0) {
event.value = "";
} else {
var monthlyRate = R / 12;
if (monthlyRate === 0) {
event.value = P / N;
} else {
event.value =
P * monthlyRate /
(1 - Math.pow(1 + monthlyRate, -N));
}
}
使用以下数据计算:
- APR:
0.21 - Term:
60 - Amount Financed:
10000.00
按照标准等额本息公式,每月还款金额约为:
[ $270.53 ]
该结果不包括税费、保险、手续费、首付款调整或其他附加费用。如果预期金额比这个结果高约 100 美元,应检查贷款中是否计入了其他费用。
原代码为什么不正确
问题主要出在这一行:
event.value = P * (R / 12), Math.pow(N, (1 + R)) / Math.pow(N, (1 + (R / 12) - 1));
这里的逗号不是数学公式的连接符,而是 JavaScript 的逗号运算符。JavaScript 会依次计算逗号两侧的表达式,最终只返回最后一个表达式的值。因此,前面的:
P * (R / 12)
不会按预期与后面的结果相乘。
贷款公式的幂运算底数应为:
1 + monthlyRate
指数则是还款期数 N。原代码将 N 作为底数,把利率相关表达式作为指数,所以计算的并不是等额本息还款金额。
如果 APR 字段填写的是 21
有些表单用 21 表示 21%,而不是用 0.21。在这种情况下,需要先将 APR 除以 100:
var APR = Number(this.getField("APR").valueAsString);
var N = Number(this.getField("Term").valueAsString);
var P = Number(
this.getField("AmountFinanced").valueAsString.replace(/[$,\s]/g, "")
);
if (isNaN(APR) || isNaN(N) || isNaN(P) || N <= 0 || P < 0) {
event.value = "";
} else {
var annualRate = APR / 100;
var monthlyRate = annualRate / 12;
if (monthlyRate === 0) {
event.value = P / N;
} else {
event.value =
P * monthlyRate /
(1 - Math.pow(1 + monthlyRate, -N));
}
}
APR 字段的输入方式必须统一:
- 输入
0.21时,直接使用R / 12 - 输入
21时,使用(APR / 100) / 12
如果输入的是 0.21,就不要再除以 100,否则系统会将其视为 0.21%。
金额格式和显示设置
如果 Amount Financed 字段显示为:
$10,000.00
直接执行:
Number("$10,000.00")
结果会是 NaN。示例中的:
.replace(/[$,\s]/g, "")
会先去掉美元符号、千位逗号和空格,再将内容转换为数字。
通常不需要在代码中为计算结果手动添加 $。可以在 Adobe Acrobat 的字段属性中将结果字段设为货币格式,并保留两位小数。这样 event.value 仍是数字,用于后续计算时也更可靠。
精简版本
如果可以确定:
- APR 始终以
0.21这类小数形式输入 - 金额字段不含美元符号或千位分隔符
- 所有输入始终有效
代码可以简化为:
var R = Number(this.getField("APR").valueAsString) / 12;
var N = Number(this.getField("Term").valueAsString);
var P = Number(this.getField("AmountFinanced").valueAsString);
event.value = R === 0
? P / N
: P * R / (1 - Math.pow(1 + R, -N));
实际表单中仍建议使用前面的完整版本,因为它能处理空字段、无效输入、金额格式和零利率等情况。
备注:内容仅供参考。
