2012-12-18 16 views
2

我想爲我的學生創建一個動態工作表,所以每次他們做時都會看到不同的問題。我試圖創建的問題,即計算如果我從總數Y中取得X的百分比。Javascript:功能檢查評分答案是否有百分比超過2個小數位

這裏有3個函數一起工作,第一個函數產生一些數字,第二個函數調用第二個函數調用第三個來檢查它是否超過2個小數位,如果是,則第二個創建一個新的SCORE號碼,該號碼重複,直到它找到小數點後2位的答案,然後返回第一個起作用的SCORE號碼,它輸出它。

我總是收到三個輸出之一:未定義SCORE應該在哪裏,根本沒有輸出或工作問題。

我不明白它是如何工作的,有時會拋出undefined,並在其他時間完全沒有提供。

任何想法。

function scorePercent() 
{ 
    var output=""; 
    var total = Math.floor((Math.random()*99)+1); 
var score = Math.floor((Math.random()*(total-1))+1); 
    output = output + "<div>A score of " + chkScore(score,total) + " out of " + total + ".</div></br>"; 

    document.getElementById("qOut").innerHTML=output; 

} 

function chkScore(n1,n2) 
{ 
    var answ = (n1/n2)*100; 
    if(dps(answ)>2) 
    { 
     var scoreNew = Math.floor((Math.random()*(n2-1))+1); 
     chkScore(scoreNew, n2); 
    } 
    else 
    { 
     return n1; 
    }  
} 

function dps(num) 
{ 
    var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); 
    if (!match) { return 0; } 
    return Math.max(
      0, 
     // Number of digits right of decimal point. 
      (match[1] ? match[1].length : 0) 
     // Adjust for scientific notation. 
     - (match[2] ? +match[2] : 0)); 
} 
+0

就像提示 - 你可以隨時打開開發工具(所有瀏覽器中的F12,可能需要在FF中安裝firebug),設置斷點並通過代碼檢查變量值。這有助於很多事情找到發生了什麼 –

+0

似乎無法找到罪魁禍首,但我會做'dps'不同的兩件事。首先你不需要將數字轉換爲字符串,如果你使用exec,var match = /regex/.exec(num)',但我不確定你真的需要那個正則表達式......你可以得到一個用模運算符的數字:'(n%1).toFixed(m)' – elclanrs

回答

3

您的chkScore遞歸函數,但你不是return從「更深」的迭代-ing的結果。

試試這個:

function chkScore(n1,n2){ 
    var answ = (n1/n2)*100; 
    if(dps(answ)>2) { 
     var scoreNew = Math.floor((Math.random()*(n2-1))+1); 
     return chkScore(scoreNew, n2); // <-- return that. 
    } else { 
     return n1; 
    }  
} 

失蹤return存在,導致功能有時不返回任何東西。

如果你知道我的意思,那麼「更深」的迭代將只返回它們的值1「level」,這樣「level」將不得不通過它。

+0

謝謝 - 這固定了未定義的問題 – user1912536

+0

另外,遞歸可能太長。在沒有輸出的情況下,發生'Uncaught RangeError:Maximum call stack size exceeded'。 –