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 倍,你将一个非空数除以 0,得到Infinity.

于 2012-09-27T15:14:22.167 回答
1

这是一个简单的语法错误:

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

这就是为什么这个声明...

firstNum+operator+secondNum+"=";

...实际上将被评估为...

firstNum+undefined+secondNum+"=";

第一对将给你NaNNaN+ Number 将NaN再次成为 a,NaN+ String ( "=") 将导致NaN转换为字符串,然后附加 '='(因此产生 'NaN=')。

我强烈建议将"use strict";line 放在脚本的开头以捕获此类错误。有了这个,你会得到一个错误:

ReferenceError: assignment to undeclared variable oprator

...并且不需要让 SO 解析您的脚本以查找错误。)

旁注,我有很多:

  • 您的randNum函数将返回一个数字,因此无需在其结果上使用parseInt(您可能必须转换此函数的参数,但即使在这里似乎也没有必要);

  • 如果你除以零,你会得到Infinity;如果你将零除以零,你会得到NaN结果;做好准备或调整最小值。)

  • 你违反了DRY 原则,重复了大部分输出结果的语句,为什么不将它们转换为函数呢?检查这个片段(由@sv_in 开始,由我完成)例如如何做。

于 2012-09-27T15:15:34.500 回答
1

当您随机选择除法运算符时,可能会同时出现choose1choose1,这意味着您尝试评估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 回答