2017-02-02 23 views
-5

私は現在、練習のためにHTML、CSS、およびJavaScriptを備えた電卓を作っています。私は、 "組み込み"のeval関数が文字列から数学を実行したことを知りました。しかし、正常に動作しません。Javascriptのeval()関数が正しく動作しません。

問題の内容がわかりません。しかし、私は例えば:11 + 11/2は11でなければなりません。何らかの理由で16.5になります。なぜ私は考えていない。私は本当にいくつかの助けに感謝します。ここで

はコードです:

function revealAnswer(){ 
      var math = document.getElementById("numbersInputted"); 
      math.innerHTML += " = " + eval(math.innerHTML); 

    } 
+4

なぜ「11 + 11/2」は「11」ですか? 「11/2」は「5.5」、「11 + 5.5」は「16.5」である。 – Pointy

+3

'(11 + 11)/ 2'を試して、演算子の優先順位について学んだときに戻ってみてください。 – Pointy

+0

私はPEDMASについてプログラミングしていないので、この質問を議論の対象にしないと投票しています – Paulpro

答えて

1

これは間違ったアプローチである理由の全体の束があります。

まず、innerHTMLは、要素のテキストコンテンツだけでなく、ネストされたHTML要素も含む文字列を返します。必要なテキストだけの場合は、textContentを使用します。

次に、同じ文字列で使用したい実際の数学演算子をユーザーが入力すると、混乱が生じます。ユーザーにそれを個別に入力させてから、if/thenロジックを使用して、最終的に正しい演算子を使用することができます。

次に(これは重要な部分です)、eval()を使用しないでください。遭遇する可能性のある問題だけを解決する必要はありませんが、ウェブサイト上の「クロスサイトスクリプティング」攻撃の扉を開きます。さらに、thisバインディングを操作し、独自のスコープでコードを実行します。

あなたが本当に行う必要があるのは、文字列入力を数字で変換して、数学を行うことができます。あなたがそうparseInt()parseFloat()

でこれを行うことができ、あなたの行は次のようになります。

math.innerHTML += " = " + parseFloat(math.textContent); 

最後に、数学のために、操作の順序は次のとおりです。

  • カッコ
  • 指数
  • Multiplicatio nは
  • Addtion
  • 減算

あなたはその部門が添加前に行われ、それはあなたの表現であることを意味見ることができます:11 + 11/211/2最初が評価され(5.5)をし、それがあります11(16.5)に加えた。

最後に、JavaScript内の+演算子は数学的な加算または文字列連結を意味し、オペランドの1つが文字列の場合は、もう一方が文字列に変換されることに注意してください。

+0

私は今それを得ると思います。私のことを学ぶ時間を過ごしてくれてありがとう! :) –

関連する問題