2016-07-17 21 views
0

Javascriptのプログラムで分数を入力として受け取り、これらの分数を使って特定の値を計算することが可能かどうかは疑問でした。私は数式((| max-min |)/((max + min)/ 2))* 100を使ったパーセンテージの差(物理学)の計算機を作ろうとしました。私はすでに入力を操作して配列で分割する方法を理解しています。したがって、私はval1とval2に最大値と最小値を格納しました。しかし、問題は計算に伴います。もともと、私は1つのステートメントで全体の数式を集めましたが、うまくいきませんでした。したがって、私は計算をステップに分け、各ステップの後に変数に値を格納して、計算が適切に行われたことを確認しました。数学で分数/小数を入力、計算、出力する

var step1=Math.abs(val1-val2); 
var step2=val1+val2; 
var step3=step2/2; 
var step4=step1/step3; 
var final=Math.round(step4*100*100)/100; 

はしかし、特に画分と小数で、まだ計算して起こってグリッチがたくさんあります。これは私が持っているものです。たとえば、90/100と89/100が入力されたときのパーセンテージ値は、9/10と89/100が配置された場合とは異なるFARになります。たまに、小数点を入力するとNaNが返されます。私は本当に何が起こっているのか分からない。パーセンテージの差を計算する上で上記のコードが間違っていることを強調したり、JavaScriptがどのように計算し、計算結果がどのように出力されているかを教えてくれる人は、間違いなく助けになります。

ありがとうございます。 :)

これは助けであれば、これはプログラムの完全なコードです。問題を解決する必要がない場合は、これを無視することができます。私は問題のコードの完全に不要な部分をすべて削除しました。

<html> 

<head> 
    <title></title> 
</head> 
<style type="text/css"> 
</style> 
<script> 
    var def; 

    function submit() { 
    var e = document.getElementById("topic"); 
    var ter = document.getElementById("term").value; 
    var strUser = e.options[e.selectedIndex].value; 

    if (!strUser) { 
     document.getElementById("textcom").value = "Please specify what needs to be solved."; 
    } 
    else if (!term) { 
     document.getElementById("textcom").value = "Please specify the values used to calculate."; 
    } 
    else { 
     if (strUser == "a") { 
     var arr = ter.split(","); 
     var val1 = parseInt(arr[0]); 
     var val2 = parseInt(arr[1]); 

     if (arr.length > 2 || arr.length < 2) { 
      def = "Error. Incorrect number of values written."; 
     } 
     else if (isNaN(val1) || isNaN(val2)) { 
      def = "Error. One or more values input is/are not a number."; 
     } 
     else { 
      var step1 = Math.abs(val1 - val2); 
      var step2 = val1 + val2; 
      var step3 = step2/2; 
      var step4 = step1/step3; 
      var final = Math.round(step4 * 100 * 100)/100; 
      def = final + "%"; 
     } 
     } 
     document.getElementById("textcom").value = def; 
    } 
    } 
</script> 

<body> 
    <h1>Physics Calculator</h1> 
    <span>Please choose desired solution:</span> 
    <select id="topic"> 
    <option disabled selected value>------ Option ------</option> 
    <option value="a">Percent Difference</option> 
    </select> 
    <br> 
    <span>Values:</span> 
    <input type="text" id="term"></input> 
    <br> 
    <br> 
    <textarea rows="20" cols="40" id="textcom">Uneditable. For output purposes only.</textarea> 
    <br> 
    <button onclick="submit()">Submit</button> 
    <script> 
    document.getElementById("textcom").readOnly = "true"; 
    </script> 
</body> 
</html> 
+0

入力とは何ですか?期待される結果は何ですか?現在の出力とは何ですか? – Rayon

+0

結果が期待通りではない*入力*入力ボックスにリテラル入力の具体例を挙げてください。あなたは時には* NaN *を得ると言っています。私たちがこのようなケースを探して検索することを期待しないでください。 – trincot

答えて

1

あなたが彼らにparseIntを適用する際にJavaScriptが数値として12/100のような画分を認識することを期待ように思えます。

。これは当てはまらない。

  • 分割(/)はJavaScriptでオペレータ(および他のほとんどの言語で)、そうでないと(小数.等)の数値表記法です。数字リテラルでは、/のような文字は使用できません。
  • 数値を小数として入力しても(15.89など)、parseIntの名前はすでにこの動作を示しています。parseIntは小数部分を無視します。 parseFloat以下を使用し、文字列にユニタリ+を適用する必要があります。暗黙的に数値に変換されます。

これを解決するには、分数表記を表す数字に変換する関数を書くことができます。

// To interpret fractions (with '/') as numbers: 
 
function evaluate(term) { 
 
    // remove spaces and get numerator and denominator 
 
    var arr = term.replace(/ /g, '').split('/'); 
 
    // get part before '/' and turn into number 
 
    var val = +arr.shift(); 
 
    // read denominator(s) and perform division(s) 
 
    while (arr.length) { 
 
    val = val/+arr.shift(); 
 
    } 
 
    return val; 
 
} 
 

 
function submit() { 
 
    var e = document.getElementById("topic"); 
 
    var ter = document.getElementById("term").value; 
 
    var strUser = e.options[e.selectedIndex].value; 
 
    var def; 
 

 
    if (!strUser) { 
 
    def = "Please specify what needs to be solved."; 
 
    } 
 
    else if (!term) { 
 
    def = "Please specify the values used to calculate."; 
 
    } 
 
    else if (strUser == "a") { 
 
    var arr = ter.split(","); 
 
    var val1 = evaluate(arr[0]); 
 
    var val2 = evaluate(arr[1]); 
 

 
    if (arr.length !== 2) { 
 
     def = "Error. Incorrect number of comma-separated values written; two expected."; 
 
    } 
 
    else if (isNaN(val1) || isNaN(val2)) { 
 
     def = "Error. One or more values input is/are not a number."; 
 
    } 
 
    else { 
 
     var step1 = Math.abs(val1 - val2); 
 
     var step2 = val1 + val2; 
 
     var step3 = step2/2; 
 
     var step4 = step1/step3; 
 
     var final = Math.round(step4 * 100 * 100)/100; 
 
     def = final + "%"; 
 
    } 
 
    } 
 
    document.getElementById("textcom").value = def; 
 
}
<span>Please choose desired solution:</span> 
 
<select id="topic"> 
 
    <option disabled selected value>------ Option ------</option> 
 
    <option value="a" selected>Percent Difference</option> 
 
</select> 
 
<br> 
 
<span>Values:</span> 
 
<input type="text" id="term"></input> 
 
<br> 
 
<br> 
 
<textarea readonly rows="3" cols="40" id="textcom">Uneditable. For output purposes only.</textarea> 
 
<br> 
 
<button onclick="submit()">Submit</button>

NB: - JavaScriptでこれを設定する必要はありませんあなたがHTMLでreadonly属性を使用できることに注意してください私はは以下のスニペットでを評価し、その関数を呼び出しています。

+0

うわー、あなたは私の質問の両方を非常に丁寧に答え、最後に私が知らなかったことをもう一つ追加しました。私が感銘を受けた。 :) –

関連する問題