1

次の関数は、6 桁を超えるローン金額の値に対して機能しないのはなぜですか。また、誤った結果が生成されるのはなぜですか?

たとえば、次のように入力した場合

Loan amount: 1,000,000
Interest Rate: 1.09
Monthly Payment: 1,500

結果: 85.39

7 桁以上を入力するとNaNが返されます。例: Loan amount: 10,000,000

function myFunction()
{
    rte = eval (1.09)/1200;
    pmt = eval (1500);
    amt = eval (1000000);

    document.getElementById("demo").innerHTML=(Math.log(1+(rte/(pmt/(amt)-rte)))/Math.log(1+rte))/12;
}

ここで確認できます JsFiddle リンク

4

1 に答える 1

2

いくつか間違いがあるので、コードをよく見てみましょう。まず、それをリファクタリングします。

  1. 出力は質問とは関係がないため、この部分を関数から削除します。
  2. グローバル変数もダメ、ハードコーディングもダメなので、関数引数にしましょう。
  3. evalここで使用する必要はまったくありません。
  4. myFunction は役に立たない名前です。

結果:

function calcLoan(rte, pmt, amt)
{
    return (Math.log(1+(rte/(pmt/(amt)-rte)))/Math.log(1+rte))/12;
}
document.getElementById("demo").innerHTML = calcLoan(1.09/1200, 1500, 1000000);

次に、関数コード自体に取り組みます。

  1. 冗長な中括弧を削除しましょう
  2. 引数名を短くして、Math のように見えるようにしましょう
  3. (一時的に)いくつかのデバッグ情報を追加しましょう。

結果:

function calcLoan(r, p, a)
{
    return Math.log( 1 + (r / (p/a - r) ) ) / Math.log(1 + r)  / 12;
}

function debugLoan(r, p, a)
    return [ p/a, Math.log( 1 + (r / (p/a - r) ) ), 1 + (r / (p/a - r) ), Math.log(1 + r) ];
}

// call
calcLoan( 1.09/1200, 1500, 1000000 );
//85.38526703746216

// call with bigger number
calcLoan( 1.09/1200, 1500, 10000000 );
// NaN, because we supply negative value to Math.log

// see it yourself
debugLoan( 1.09/1200, 1500, 10000000 );
// [0.00015, NaN, -0.19780219780219777, 0.0009079210482536982]

[Math.log参照] ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log ) でわかるように、引数として負の値を指定すると、常に NaN になります。 .

つまり、コードが悪いだけでなく、式も間違っています。

于 2013-06-22T06:52:46.353 に答える