PAYATHON 2026

如何用 JavaScript 计算每月汽车还款金额

数据阿明

结论

等额本息贷款应使用以下标准公式:

[ M = P \times \frac{r(1+r)^N}{(1+r)^N-1} ]

其中:

  • M:每月还款金额
  • P:贷款本金(Amount Financed)
  • r:月利率,即年利率除以 12
  • N:总还款期数(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));

实际表单中仍建议使用前面的完整版本,因为它能处理空字段、无效输入、金额格式和零利率等情况。

备注:内容仅供参考。