ランディングページにローン計算機を載せました。バックエンドもリクエストもなく、訪問者が4〜5個の数値を入力するだけで答えが表示されます。全体が小さな1つの関数です。それでも2回作り直しました。どちらのバグも出力が金額になるまで見えないからです。
罠1: PMTは0%でゼロ除算する
ExcelのPMT(rate, nper, pv, fv, type)は年金支払いの閉形式です:
function pmt(rate, nper, pv, fv, type) {
if (nper === 0) return 0;
if (rate === 0) return -(pv + fv) / nper; // <- the branch people forget
const f = Math.pow(1 + rate, nper);
return -(pv * f + fv) * rate / ((f - 1) * (1 + rate * type));
}
Enter fullscreen mode Exit fullscreen mode
rate === 0の行を削除すると、一般式の分母で(f - 1) === 0となり、ディーラーが宣伝する0%ローンでInfinityまたはNaNが返ります。Excelにはこの分岐があります。金融の教科書から代数式だけを写すと、ありません。
2つ目の注意点は符号です。pmtは正の現在価値に対して負の値を返します。Excelが「お金があなたから出ていく」モデルだからです。残高を-balanceで渡すと正の支払額が得られ、以降の計算が読みやすくなります。
罠2: ExcelのROUNDとJavaScriptのMath.roundは一致しない
JavaScriptのMath.roundは正の無限大方向への半上げです: Math.round(-2.5) === -2。ExcelのROUNDはゼロから遠ざかる半上げです: ROUND(-2.5, 0)は-3になります。貯蓄額を表示するページでは、ブラウザとユーザーがダウンロードするスプレッドシートの間に1セントの差が生じ、その1セントで「どちらかが壊れている」と判断される可能性があります。
function excelRound(x, digits) {
const m = Math.pow(10, digits), v = x * m;
const a = Math.abs(v), fl = Math.floor(a);
const r = ((a - fl) >= 0.5 ? fl + 1 : fl) * (v < 0 ? -1 : 1);
return r / m;
}
Enter fullscreen mode Exit fullscreen mode
なぜ一致させる必要があるのか
スプレッドシートが製品で、ページがデモだからです。2つが1セントでも食い違えば、デモは訪問者に「製品を信用しないで」と伝えることになります。
本番版は自動車の借り換え計算機です。スプレッドシートの9入力のうち5つ、6結果のうち2つをページ内で同じ数式で実行します。入力した数値はブラウザから出ません。ダウンロードしなくても意味がある出力が2つあります: 月々の支払いが実際にどれだけ減るか、クロージングコストが回収されるまで何ヶ月かかるか。デフォルト値では80.24ドルと2.3ヶ月です。
こちらで操作できます: car refinance calculator
答えを左右する入力は、実は残高の清算額です。融資アプリに表示されている残高とは通常異なります。清算額を電話で確認してください。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.