Добавление двух чисел объединяет их вместо расчета суммы


185

Я добавляю два числа, но я не получаю правильное значение.

Например, выполнение 1 + 2возвращает 12, а не 3

Что я делаю не так в этом коде?

function myFunction() {
  var y = document.getElementById("txt1").value;
  var z = document.getElementById("txt2").value;
  var x = y + z;
  document.getElementById("demo").innerHTML = x;
}
<p>
  Click the button to calculate x.
  <button onclick="myFunction()">Try it</button>
</p>
<p>
  Enter first number:
  <input type="text" id="txt1" name="text1" value="1">
  Enter second number:
  <input type="text" id="txt2" name="text2" value="2">
</p>
<p id="demo"></p>


Какой тип значений вы ожидаете в качестве входных данных? Целые числа или десятичные дроби?
Зорайр

1
Значение ввода текста будет строкой, и строки всегда будут объединяться вместо сложения
Хэнк

1
Хорошая статья о конвертации есть в этом ответе .
Акт


Если у вас есть <input type="number">, вы можете просто получить его .valueAsNumberсобственность напрямую.
user4642212

Ответы:


343

На самом деле это строки, а не числа. Самый простой способ получить число из строки - добавить к нему +:

var x = +y + +z;

4
из любопытства (я не программист на JavaScript) (и я думаю, что это улучшило бы ответ), что +-prefix делает со строками?
Себастьян Мах

30
Приведенный выше код немного странный и запутает менее опытных разработчиков. Код также потерпит неудачу в JSLint из-за запутанного использования '+'.
Зорайр


10
@AKTed: На самом деле я хотел спровоцировать elclanrs немного описать это в своем ответе. Конечно, я не могу самостоятельно выполнить поиск в Google; но это (imo) улучшит качество ответа, особенно потому, что использование префикса + для преобразования строк довольно редко встречается в других языках программирования и может запутать новичков. (однако, спасибо за то, что поделились ссылкой)
Себастьян Мах

2
Я бы никому не рекомендовал использовать этот ярлык. Я знаю, что на самом деле для разбора строки на число требуется больше кода, но, по крайней мере, код явно соответствует цели.
Си Келли


29

Вам нужно использовать parseInt()метод javaScript, чтобы превратить строки обратно в числа. Прямо сейчас они являются строками, поэтому добавление двух строк объединяет их, поэтому вы получаете «12».


1
Я не уверен, что parseInt()это лучший вариант, учитывая, что функция OP добавляет два введенных пользователем "числа", а не два "целых числа".
nnnnnn

2
@nnnnnn Я думаю, это можно легко исправить, parseFloatесли ОП предоставит больше информации.
Йоши

1
@Yoshi - Да, да, это возможно, но, учитывая, что в ответе нигде не говорится, что parseInt()возвращаются только целые числа, и не объясняются какие-либо parseInt()«причуды» - что может быть проблемой с данными, введенными пользователем - я думал, что стоит упомянуть. (На самом деле я не понизил голос или что-то в этом роде.)
nnnnnn

Да, я сделал предположение, что входные данные будут целыми числами, так как они привели пример 1 + 2, но вы правы - parseFloat () может быть лучше, если они являются просто любыми «числами».
Митим

22

Используйте parseInt (...), но убедитесь, что вы указали значение radix; в противном случае вы столкнетесь с несколькими ошибками (если строка начинается с «0», основание будет восьмеричным / 8 и т. д.).

var x = parseInt(stringValueX, 10);
var y = parseInt(stringValueY, 10);

alert(x + y);

Надеюсь это поможет!


5
Я не уверен, что parseInt()это лучший вариант, учитывая, что функция OP добавляет два введенных пользователем "числа", а не два "целых числа".
nnnnnn

1
Если он не ожидает значений с плавающей запятой, я думаю, что использование этого подхода все еще прекрасно работает.
Зорайр

1
Это больше не проблема в ES6. Основание может быть безопасно опущено. parseInt("012")работает нормально, возвращая 12. Конечно, вы все равно должны быть осторожны с такими вещами, как [1,2].map(parseInt).

6

Просто добавьте простой метод приведения типов, поскольку ввод берется в текст. Используйте следующее:

    var y = parseInt(document.getElementById("txt1").value);
    var z = parseInt(document.getElementById("txt2").value);
    var x = y + z;

6

Следующее может быть полезно в общих чертах.

  • Во-первых, поля формы HTML ограничены текстом . Это особенно относится к текстовым полям, даже если вы приложили все усилия, чтобы значение выглядело как число.

  • Во-вторых, JavaScript, к лучшему или к худшему, перегружал +оператора двумя значениями: он добавляет числа и объединяет строки. У него есть предпочтение для конкатенации, поэтому даже выражение like 3+'4'будет рассматриваться как конкатенация.

  • В-третьих, JavaScript будет пытаться динамически изменять типы, если это возможно, и при необходимости. Например '2'*'3', оба типа будут заменены числами, поскольку вы не можете умножать строки. Если один из них несовместим, вы получите NaN, а не номер.

Ваша проблема возникает из-за того, что данные, поступающие из формы, рассматриваются как строка, а + поэтому они будут объединяться, а не добавляться.

Читая предположительно числовые данные из формы, вы всегда должны проталкивать их parseInt()илиparseFloat() , в зависимости от того, хотите ли вы целое или десятичное число.

Обратите внимание, что ни одна из функций действительно не преобразует строку в число. Вместо этого он будет анализировать строку слева направо, пока не достигнет недопустимого числового символа или до конца, и преобразует то, что было принято. В случаеparseFloat , это включает в себя один десятичный знак, но не два.

Все, что находится после действительного номера, просто игнорируется. Они терпят неудачу, если строка даже не начинается как число. Тогда вы получите NaN.

Хорошая техника общего назначения для чисел из форм выглядит примерно так:

var data=parseInt(form.elements['data'].value); //  or parseFloat

Если вы готовы объединить недопустимую строку в 0, вы можете использовать:

var data=parseInt(form.elements['data'].value) || 0;


4

Это не будет суммировать число; вместо этого это объединит это:

var x = y + z;

Вам нужно сделать:

var x = (y)+(z);

Вы должны использовать parseInt, чтобы указать операцию над числами. Пример:

var x = parseInt(y) + parseInt(z); [final soulution, as everything us]

Это должен быть правильный ответ, additionа subtractionне принятый.
MR_AMDEV

3

Этот код суммирует обе переменные! Поместите это в свою функцию

var y = parseInt(document.getElementById("txt1").value);
var z = parseInt(document.getElementById("txt2").value);
var x = (y +z);
document.getElementById("demo").innerHTML = x;`

1

Вы пропускаете преобразование типов на этапе добавления ...
var x = y + z;должно бытьvar x = parseInt(y) + parseInt(z);

 <!DOCTYPE html>

 <html>
 <body>
  <p>Click the button to calculate x.</p>
  <button onclick="myFunction()">Try it</button>
  <br/>
  <br/>Enter first number:
  <input type="text" id="txt1" name="text1">Enter second number:
  <input type="text" id="txt2" name="text2">
  <p id="demo"></p>
 <script>
    function myFunction() 
    {
      var y = document.getElementById("txt1").value;
      var z = document.getElementById("txt2").value;
      var x = parseInt(y) + parseInt(z);
      document.getElementById("demo").innerHTML = x;
    }
 </script>
 </body>
 </html>

1
  <input type="text" name="num1" id="num1" onkeyup="sum()">
  <input type="text" name="num2" id="num2" onkeyup="sum()">
  <input type="text" name="num2" id="result">

  <script>
     function sum()
     {

        var number1 = document.getElementById('num1').value;
        var number2 = document.getElementById('num2').value;

        if (number1 == '') {
           number1 = 0
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else if(number2 == '')
        {
           number2 = 0;
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }
        else
        {
           var num3 = parseInt(number1) + parseInt(number2);
           document.getElementById('result').value = num3;
        }

     }
  </script>

3
Добавьте некоторое объяснение с ответом о том, как этот ответ помогает ОП в исправлении текущей проблемы
ρяσѕρєя K

1

Это очень просто:

<html>

    <body>
        <p>Click the button to calculate x.</p>
        <button onclick="myFunction()">Try it</button>
        <br/>
        <br/>Enter first number:
        <input type="text" id="txt1" name="text1">Enter second number:
        <input type="text" id="txt2" name="text2">
        <p id="demo"></p>

        <script>
            function myFunction() {
                var y = document.getElementById("txt1").value;
                var z = document.getElementById("txt2").value;
                var x = +y + +z;
                document.getElementById("demo").innerHTML = x;
            }
        </script>
    </body>
</html>

1

Попробуй это:

<!DOCTYPE html>
<html>

    <body>
        <p>Add Section</p>

        <label>First Number:</label>
        <input id="txt1"  type="text"/><br />
        <label>Second Number:</label>
        <input id="txt2"  type="text"/><br />

        <input type="button" name="Add" value="Add" onclick="addTwoNumber()"/>
        <p id="demo"></p>

        <script>
            function myFunction() {
                document.getElementById("demo").innerHTML = Date();
            }

            function addTwoNumber(){
                var a = document.getElementById("txt1").value;
                var b = document.getElementById("txt2").value;

                var x = Number(a) + Number(b);
                document.getElementById("demo").innerHTML = "Add Value: " + x;
            }
        </script>
    </body>
</html>

1
    <head>
        <script type="text/javascript">
            function addition()
            {
                var a = parseInt(form.input1.value);
                var b = parseInt(form.input2.value);
                var c = a+b
                document.write(c);
            }
        </script>
    </head>

    <body>
        <form name="form" method="GET">
        <input type="text" name="input1" value=20><br>
        <input type="text" name="input2" value=10><br>
        <input type="button" value="ADD" onclick="addition()">
        </form>
    </body>
</html>

3
Добро пожаловать на ТАК! Можете ли вы объяснить немного больше? Ваш ответ - только код, поэтому он может работать, но спрашивающий (или другие посетители!) Могут не понимать, почему он работает.
Chilion

1

Если у нас есть два поля ввода, тогда получите значения из полей ввода, а затем добавьте их с помощью JavaScript.

$('input[name="yourname"]').keyup(function(event) {
    /* Act on the event */
    var value1 = $(this).val();
    var value2 = $('input[name="secondName"]').val();
    var roundofa = +value2+ +value1;

    $('input[name="total"]').val(addition);
});

0

Вы можете выполнить предварительную проверку с помощью регулярного выражения, если они числа как

function myFunction() {
    var y = document.getElementById("txt1").value;
    var z = document.getElementById("txt2").value;
    if((x.search(/[^0-9]/g) != -1)&&(y.search(/[^0-9]/g) != -1))
      var x = Number(y)+ Number(z);
    else
      alert("invalid values....");
    document.getElementById("demo").innerHTML = x;
  }

Вместо регулярных выражений вы можете просто использовать parseXX и проверить возвращение NaN.
Хэнк

Проверка введенных пользователем данных всегда является хорошим планом, но вам все еще нужно преобразовать входные строки в числовую форму, прежде чем вы сможете выполнить числовое сложение.
nnnnnn

0

Используйте parseFloatего, чтобы преобразовать строку в число, включая десятичные значения.

 function myFunction() {
      var y = document.getElementById("txt1").value;
      var z = document.getElementById("txt2").value;
      var x = parseFloat(y) + parseFloat(z);
      document.getElementById("demo").innerHTML = x;
    }


<p>
  Click the button to calculate x.
  <button onclick="myFunction()">Try it</button>
</p>
<p>
  Enter first number:
  <input type="text" id="txt1" name="text1" value="1">
  Enter second number:
  <input type="text" id="txt2" name="text2" value="2">
</p>
<p id="demo"></p>

0

Вы также можете написать: var z = x - -y; И вы получите правильный ответ.

<body>

<input type="text" id="number1" name="">
<input type="text" id="number2" name="">
<button type="button" onclick="myFunction()">Submit</button>

<p id="demo"></p>

    <script>
    function myFunction() {
        var x, y ;

        x = document.getElementById('number1').value;
        y = document.getElementById('number2').value;

        var z = x - -y ;

        document.getElementById('demo').innerHTML = z;
    }
    </script>
</body>

0

Здесь идет ваш код путем анализа переменных в функции.

<html>
  <body>
    <p>Click the button to calculate x.</p>
    <button onclick="myFunction()">Try it</button>
    <br/>
    <br/>Enter first number:
    <input type="text" id="txt1" name="text1">
    <br>Enter second number:
    <input type="text" id="txt2" name="text2">
    <p id="demo"></p>
    <script>
      function myFunction() {
        var y = parseInt(document.getElementById("txt1").value);
        var z = parseInt(document.getElementById("txt2").value);
        var x = y + z;
        document.getElementById("demo").innerHTML = x;
      }
    </script>
  </body>
</html>

Ответ

Введите описание изображения здесь


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.