1

私はランダムに基本的な数学演算(加算、減算、乗算、除算)を生成しようとしていますが、関数がNaNを返すことがあります。関数parseInt()を使用しましたが、それでも同じ問題があります。誰かが私に何か提案を手伝ってくれるなら、私は感謝します。前もって感謝します!

Here is my code:

function randNum(min,max)
{
    var num = min+Math.floor((Math.random()*(max-min+1)));
    return num;
}

var choose, operator, firstNum, secondNum,rightAnswer;
function getProb()
{
    var chooseOp=randNum(1,4);
    choose=parseInt(chooseOp);

if (choose==1)
{
    oprator="+";
    var choose1=randNum(0,10);
    var choose2=randNum(0,10);
    firstNum=parseInt(choose1);
    secondNum=parseInt(choose2);
    document.getElementById("mathProb").innerHTML=firstNum+operator+secondNum+"=";
    rightAnswer=choose1 + choose2;
}
else if (choose==2)
{
    operator="-";
    var choose1=randNum(0,10);
    var choose2=randNum(0,10);
    firstNum=parseInt(choose1);
    secondNum=parseInt(choose2);
    document.getElementById("mathProb").innerHTML=firstNum+operator+secondNum+"=";
    rightAnswer=firstNum - secondNum;
}
else if (choose==3)
{
    operator="x";
    var choose1=randNum(0,10);
    var choose2=randNum(0,10);
    firstNum=parseInt(choose1);
    secondNum=parseInt(choose2);
    document.getElementById("mathProb").innerHTML=firstNum+operator+secondNum+"=";
    rightAnswer=choose1 * choose2;
}
    else if (choose==4)
{
    operator="/";
    var choose1=randNum(0,10);
    var choose2=randNum(0,10);
    firstNum=parseInt(choose1);
    secondNum=parseInt(choose2);
    document.getElementById("mathProb").innerHTML=firstNum+operator+secondNum+"=";
    rightAnswer=choose1/choose2;
}
}
4

6 に答える 6

5

choose==1、のつづりが。operatorと間違っている場合oprator。修正すれば問題は解決します http://jsfiddle.net/uERwd/2/

更新: コードは次のように短くすることができます:http://jsfiddle.net/uERwd/3/

于 2012-09-27T15:19:54.077 に答える
3

除算演算では、ゼロで除算する可能性があります。これにより、NaNが返されます。

于 2012-09-27T15:13:53.707 に答える
2

あなたの「NaN」バグはここにあります:

rightAnswer=choose1/choose2;

choose1anchoose2はの整数です[0, 1]

121を超えると、0を0で除算しますNaN

そして、11を超える1回弱で、null以外の数を0で除算します。これにより、が得られInfinityます。

于 2012-09-27T15:14:22.167 に答える
1

これは単純な構文エラーです。

oprator="+"; // should be `operator`

そのため、このステートメントは...

firstNum+operator+secondNum+"=";

...実際には...として評価されます

firstNum+undefined+secondNum+"=";

最初のペアはあなたに与えますNaNNaN+数値はNaN再びなります、そしてNaN+文字列("=")はNaN文字列に変換され、次に'='が追加されます(したがって'NaN ='になります)。

"use strict";このようなエラーをキャッチするために、スクリプトの先頭に行を配置することを強くお勧めします。これにより、エラーが発生します。

ReferenceError: assignment to undeclared variable oprator

...代わりに、SOにスクリプトのエラー解析を行わせる必要はありません。)。

補足、私はそれらをたくさん持っています:

  • randNum関数は数値を返すので、結果に使用する必要はありません(この関数の引数parseIntを変換する必要があるかもしれませんが、それでもここでは必要ないようです)。

  • ゼロで割ると、次のようになりInfinityます。ゼロをゼロで割るNaNと、結果として得られます。準備するか、最小値を調整します。)。

  • DRYの原則に違反し、結果を出力するステートメントのほとんどを繰り返します。なぜそれらを関数に変換しないのですか?このスニペット(@sv_inで開始、私が完成)を確認してください。たとえば、その方法を確認してください。

于 2012-09-27T15:15:34.500 に答える
1

choose1除算演算子をランダムに選択すると、との両方でゼロが出てくる可能性があります。choose1つまり、を評価しようとしrightAnswer = 0 / 0;ます。Javascriptでは、これはに等しくなりNaNます。さらに、これはより頻繁に発生するはずです。分母でゼロを選択すると、分子で他の数値を選択すると、答えはとして出力されInfinityます。もちろん、何よりもゼロはゼロです。

于 2012-09-27T15:16:10.207 に答える
1

記数法を表す数字で指定する必要があります。通常、基数10です。

http://www.w3schools.com/jsref/jsref_parseint.asp

このように関数呼び出しに番号10を追加します

firstNum = parseInt(choose1, 10);
于 2012-09-27T15:10:23.807 に答える