2017-02-02 8 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(). Не обязательно решать какие-либо проблемы, с которыми вы могли столкнуться, но это открывает дверь для атак типа «Cross Site Scripting» на ваш сайт. Кроме того, он управляет привязкой this и выполняет свой код в своей области.

Что вам действительно нужно сделать, это просто преобразовать ввод строки в число, чтобы вы могли с ней справиться. Вы можете сделать это с parseInt() и parseFloat()

Итак, ваша линия может быть:

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

Наконец, по математике, порядок операций:

  • Скобки
  • Показатели:
  • Мультипликация п
  • Отдел
  • Addtion
  • Вычитание

Вы можете видеть, что деление сделано до того, и это означает, что в вашем выражении: 11 + 11/2, первый 11/2 оценивается (5.5), а затем это добавлено к 11 (16,5).

Наконец, помните, что оператор + в JavaScript может означать математическое сложение или конкатенацию строк, и если один из операндов является строкой, другой будет преобразован в строку.

+0

Хорошо. Думаю, я понял это сейчас. Спасибо, что потратили некоторое время, чтобы узнать меня! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^