A adição de dois números concatena-os em vez de calcular a soma

184

Estou adicionando dois números, mas não recebo o valor correto.

Por exemplo, fazer 1 + 2retornos 12 e não 3

O que estou fazendo de errado neste código?

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>

okconfused
fonte
Que tipo de valores você espera como entrada? Inteiros ou decimais?
Zorayr
1
Um valor de entrada de texto será cordas e cordas sempre concatenar em vez de disso
Hank
1
Uma boa descrição sobre a conversão está nesta resposta .
usar o seguinte comando
Se você tiver um <input type="number">, pode simplesmente obter sua .valueAsNumberpropriedade diretamente.
user4642212

Respostas:

343

Na verdade, são strings, não números. A maneira mais fácil de produzir um número a partir de uma string é acrescentá-lo com +:

var x = +y + +z;
elclanrs
fonte
4
por curiosidade (eu não sou um programador JavaScript) (e acho que isso melhoraria a resposta), o que o +prefixo-faz com as strings?
Sebastian Mach
30
O código acima é um pouco bizarro e confunde desenvolvedores menos experientes. O código também falhará no JSLint por confundir o uso de '+'.
Zorayr
2
@phresnel: unary + operadores
akTed
10
@AKTed: Na verdade, eu queria provocar elclanrs para descrevê-lo um pouco dentro de sua resposta. Claro que não sou capaz de fazer a pesquisa no google; mas isso (imo) melhoraria a qualidade da resposta, especialmente porque o uso do prefixo + para a conversão de strings é bastante incomum em outras linguagens de programação e pode confundir iniciantes. (no entanto, obrigado por compartilhar o link)
Sebastian Mach
2
Eu desencorajaria qualquer um a usar esse atalho. Eu sei que realmente analisar uma string em um número requer mais código, mas pelo menos o código corresponde claramente à intenção.
Si Kelly
130

Eu apenas uso Number():

var i=2;  
var j=3;  
var k = Number(i) + Number(j); // 5  
Gerard
fonte
2
Eu continuava cometendo esse erro, que sempre concorda: var k += Number(i)
John Phelps
Útil, Obrigado
Prasad Patel
29

Você precisa usar o parseInt()método javaScript para transformar as strings novamente em números. No momento, eles são strings; portanto, a adição de duas strings concatena-as, e é por isso que você está recebendo "12".

mitim
fonte
1
Não sei se parseInt()é a melhor opção aqui, já que a função do OP está adicionando dois "números" inseridos pelo usuário, não dois "números inteiros".
Nnnnnn
2
@nnnnnn Eu acho que isso poderia ser facilmente alterado parseFloatse o OP fornecer mais informações.
Yoshi
1
@ Yoshi - Sim, sim, poderia, mas como a resposta não diz em lugar algum que parseInt()só retorna números inteiros e não explica nenhuma das parseInt()"peculiaridades" de s - o que pode ser um problema com os dados inseridos pelo usuário - eu pensei que valia a pena mencionar. (Eu realmente não downvote ou qualquer coisa.)
nnnnnn
Sim, eu assumi que a entrada seria um número inteiro, pois eles deram um exemplo de 1 + 2, mas você está certo - parseFloat () pode ser melhor se forem apenas quaisquer 'números'.
Mitim
22

Use parseInt (...), mas certifique-se de especificar um valor de raiz; caso contrário, você encontrará vários bugs (se a sequência começar com "0", a raiz será octal / 8 etc.).

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

alert(x + y);

Espero que isto ajude!

Zorayr
fonte
5
Não sei se parseInt()é a melhor opção aqui, já que a função do OP está adicionando dois "números" inseridos pelo usuário, não dois "números inteiros".
Nnnnnn
1
A menos que ele esteja esperando valores de ponto flutuante, acho que o uso dessa abordagem ainda funciona muito bem.
Zorayr
1
Isso não é mais um problema no ES6. O radical pode ser omitido com segurança. parseInt("012")funciona bem, retornando 12. Claro, você ainda precisa tomar cuidado com coisas como [1,2].map(parseInt).
6

Basta adicionar um método de conversão de tipo simples, pois a entrada é inserida em texto. Use o seguinte:

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

O seguinte pode ser útil em termos gerais.

  • Primeiro, os campos do formulário HTML são limitados ao texto . Isso se aplica especialmente às caixas de texto, mesmo que você tenha se esforçado para garantir que o valor pareça um número.

  • Segundo, o JavaScript, para o bem ou para o mal, sobrecarregou o +operador com dois significados: adiciona números e concatena as strings. Tem uma preferência por concatenação, portanto, mesmo uma expressão como 3+'4'será tratada como concatenação.

  • Terceiro, o JavaScript tentará alterar os tipos dinamicamente, se puder, e se for necessário. Por exemplo '2'*'3', os dois tipos serão alterados para números, pois você não pode multiplicar cadeias. Se um deles for incompatível, você receberá NaN, Não é um número.

Seu problema ocorre porque os dados provenientes do formulário são considerados como uma seqüência de caracteres e +, portanto, concatenam em vez de adicionar.

Ao ler dados supostamente numéricos de um formulário, você deve sempre enviá-los parseInt()ou parseFloat(), dependendo se você deseja um número inteiro ou um decimal.

Observe que nenhuma das funções converte verdadeiramente uma seqüência de caracteres em um número. Em vez disso, ele analisará a sequência da esquerda para a direita até chegar a um caractere numérico inválido ou até o final e converterá o que foi aceito. No caso de parseFloat, isso inclui um ponto decimal, mas não dois.

Qualquer coisa após o número válido é simplesmente ignorada. Eles falham se a string nem começa como um número. Então você receberá NaN.

Uma boa técnica de propósito geral para números de formulários é algo como isto:

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

Se você estiver preparado para combinar uma sequência inválida a 0, poderá usar:

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

Simples

var result = parseInt("1") + parseInt("2");
console.log(result ); // Outputs 3
Murtaza Khursheed Hussain
fonte
4

Isso não resume o número; em vez disso, concatenará:

var x = y + z;

Você precisa fazer:

var x = (y)+(z);

Você deve usar parseInt para especificar a operação nos números. Exemplo:

var x = parseInt(y) + parseInt(z); [final soulution, as everything us]
Pushp Singh
fonte
Essa deve ser a resposta correta para additione subtractionnão a aceita.
MR_AMDEV 20/04/19
3

Este código soma as duas variáveis! Coloque-o em sua função

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

Está faltando a conversão de tipo durante a etapa de adição ...
var x = y + z;deve servar 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>
sharjeel
fonte
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>
Ahmad Ajaj
fonte
3
Adicione um pouco de explicação com a resposta de como essa resposta ajuda OP na fixação edição atual
ρяσѕρєя K
1

É muito simples:

<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>
Peter Mortensen
fonte
1

Tente o seguinte:

<!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>
Mohammed Ebrahim
fonte
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>
Lakshmi
fonte
3
Bem-vindo ao SO! Você pode explicar um pouco mais? Sua resposta é apenas código, portanto pode funcionar, mas o interlocutor (ou outros visitantes!) Pode não entender por que funciona.
Chilion
1

Se tivermos dois campos de entrada, obtenha os valores dos campos de entrada e adicione-os usando 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);
});
Asad Ali
fonte
0

Você pode fazer um pré-cheque com a expressão regular enquanto são números, como

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;
  }
RAM
fonte
Em vez de expressões regulares, você pode usar o parseXX e verificar o retorno do NaN.
Hank
A validação de dados inseridos pelo usuário é sempre um bom plano, mas você ainda precisa converter as cadeias de entrada em formato numérico antes de poder fazer uma adição numérica.
Nnnnnn
0

Use parseFloat-o para converter string em número, incluindo valores decimais.

 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>
Poorna Rao
fonte
0

Você também pode escrever: var z = x - -y; E você obtém a resposta correta.

<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>
PA010
fonte
0

Aqui vai o seu código analisando as variáveis ​​na função.

<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>

Responda

Digite a descrição da imagem aqui

Manoj Krishna
fonte
-2

Uma solução alternativa, apenas compartilhando :):

var result=eval(num1)+eval(num2);
user3201772
fonte
Não é tão bom quanto usar o plugin aritmético do jQuery , mas eu gosto.
Paul Draper