Jak dodać dwa ciągi, jakby były liczbami?

176

Mam dwa ciągi zawierające tylko liczby:

var num1 = '20',
    num2 = '30.5';

Spodziewałbym się, że mógłbym je dodać do siebie, ale zamiast tego są one łączone:

num1 + num2; // = '2030.5'

Jak mogę wymusić traktowanie tych ciągów jako liczb?

Andrzej
źródło

Odpowiedzi:

378

Najpierw użyłbym jednoargumentowego operatora plus, aby przekonwertować je na liczby.

+num1 + +num2;
ChaosPandion
źródło
9
Bardzo fajny. Dzięki za udostępnienie tego. Znalazłem ten artykuł, który opisuje jednoargumentowy operator plus i niektóre z jego przydatnych wpływów na różne typy danych. xkr.us/articles/javascript/unary-add
mrtsherman
4
Ale jeśli te liczby są większe niż 2 ^ 53, będziesz musiał utworzyć funkcję, aby dodać części ciągów i przenieść przeniesienia do każdej części w pętli. : D
trusktr
2
To dało mi błąd, więc zamiast tego użyłem parseFloat ().
Hawkee
1
Zobacz także odpowiedź @NicholasCarey poniżej: stackoverflow.com/a/8976770/1579667
Benj
Czy jest na to mniej hakerski sposób? (Zastrzeżenie: tak zawsze to robiłem.)
seebiscuit
20

Dokumentacja MDN dla parseInt Dokumentacja
MDN dla parseFloat

W parseInt podstawa jest określana jako dziesięć, więc mamy podstawę 10. W javascript typu nonstrict liczba poprzedzona znakiem 0jest traktowana jako ósemkowa. To oczywiście spowodowałoby problemy!

parseInt(num1, 10) + parseInt(num2, 10) //base10
parseFloat(num1) + parseFloat(num2)

Zobacz także odpowiedź ChaosPandion, aby uzyskać przydatny skrót używający jednoargumentowego operatora . Ustawiłem skrzypce, aby pokazać różne zachowania.

http://jsfiddle.net/EtX6G/

var ten = '10';
var zero_ten = '010';
var one = '1';
var body = document.getElementsByTagName('body')[0];

Append(parseInt(ten) + parseInt(one));
Append(parseInt(zero_ten) + parseInt(one));
Append(+ten + +one);
Append(+zero_ten + +one);

function Append(text) {
    body.appendChild(document.createTextNode(text));
    body.appendChild(document.createElement('br'));
}
mrtsherman
źródło
2
użyj parseFloat (), jeśli masz ułamki dziesiętne. :)
Diodeus - James MacFarlane
1
Również naprawdę powinieneś określić radix jako 10.
ChaosPandion
I +num1 + +num2jest krótszy, prawdopodobnie bardziej elegancki. Zasadniczo +operator jednoargumentowy konwertuje naNumber
Raynos
Czy nie tracisz dziesiętnego .5, kiedy wykonujesz parseInt?
DOK
Warto wiedzieć, że parseInt i parseFloat są eksperymentalne i nie są szeroko obsługiwane w różnych przeglądarkach - prawie nie są obsługiwane na urządzeniach mobilnych.
Będzie
14

Zalecałbym użycie jednoargumentowego operatora plus, aby wymusić traktowanie ostatecznego ciągu jako liczby, w nawiasach, aby kod był bardziej czytelny, jak poniżej:

(+varname)

Więc w twoim przypadku jest to:

var num1 = '20',
    num2 = '30.5';

var sum = (+num1) + (+num2);

// Just to test it
console.log( sum ); // 50.5
Luca Borrione
źródło
12
var result = Number(num1) + Number(num2);
nieokreślony
źródło
6

Jeśli chcesz dodać do siebie dwa ciągi, które są bardzo dużymi liczbami, musisz obliczyć dodawanie w każdej pozycji ciągu:

function addStrings(str1, str2){
  str1a = str1.split('').reverse();
  str2a = str2.split('').reverse();
  let output = '';
  let longer = Math.max(str1.length, str2.length);
  let carry = false;
  for (let i = 0; i < longer; i++) {
    let result
    if (str1a[i] && str2a[i]) {
      result = parseInt(str1a[i]) + parseInt(str2a[i]);

    } else if (str1a[i] && !str2a[i]) {
      result = parseInt(str1a[i]);

    } else if (!str1a[i] && str2a[i]) {
      result = parseInt(str2a[i]);
    }

    if (carry) {
        result += 1;
        carry = false;
    }
    if(result >= 10) {
      carry = true;
      output += result.toString()[1];
    }else {
      output += result.toString();
    }
  }
  output = output.split('').reverse().join('');

  if(carry) {
    output = '1' + output;
  }
  return output;
}
kugyousha
źródło
5

Możesz tego użyć, aby dodać numery:

var x = +num1 + +num2;
Gurwinder Singh
źródło
4

próbować

var x = parseFloat(num1) + parseFloat(num2) ;

lub w zależności od potrzeb:

var x = parseInt(num1) + parseInt(num2) ;

http://www.javascripter.net/faq/convert2.htm

Może zechcesz sięgnąć po książkę Javascript: The Good Parts autorstwa Douglasa Crockforda. Javascript ma dość pokaźną kolekcję problemów! Ta książka ma duży wpływ na ich wyjaśnienie. Zobacz też

oraz doskonały esej pana Crockforda, Javascript: The World's Most Misunderstood Programming Language .

Nicholas Carey
źródło
3

Zawsze odejmowałem zero.

num1-0 + num2-0;

Przyznane, że metoda operatora jednoargumentowego jest o jeden znak mniej, ale nie każdy wie, czym jest operator jednoargumentowy lub jak google, aby dowiedzieć się, kiedy nie wiedzą, jak się nazywa.

adam0101
źródło
2

Jeśli chcesz wykonywać operacje na liczbach jako łańcuchach (jak w przypadku, gdy liczby są większe niż 64 bity), możesz użyć biblioteki big-integer .

const bigInt = require('big-integer')
bigInt("999").add("1").toString() // output: "1000"
Marcelo Lazaroni
źródło
2

Tutaj masz dwie możliwości, aby to zrobić: -

Możesz użyć jednoargumentowego plusa, aby przekonwertować numer ciągu na liczbę całkowitą.

Możesz to również osiągnąć, analizując liczbę na odpowiedni typ. tj. parseInt (), parseFloat () itp

.

Teraz pokażę ci tutaj za pomocą przykładów (znajdź sumę dwóch liczb).

Korzystanie z jednoargumentowego operatora plus

<!DOCTYPE html>
<html>
<body>

<H1>Program for sum of two numbers.</H1>
<p id="myId"></p>
<script>
var x = prompt("Please enter the first number.");//prompt will always return string value
var y = prompt("Please enter the second nubmer.");
var z = +x + +y;    
document.getElementById("myId").innerHTML ="Sum of "+x+" and "+y+" is "+z;
</script>
</body>
</html>

Korzystanie z metody analizowania

<!DOCTYPE html>
<html>
<body>

<H1>Program for sum of two numbers.</H1>
<p id="myId"></p>
<script>
var x = prompt("Please enter the first number.");
var y = prompt("Please enter the second number.");   
var z = parseInt(x) + parseInt(y);
document.getElementById("myId").innerHTML ="Sum of "+x+" and "+y+" is "+z;
</script>
</body>
</html>
Brajesh
źródło
2
function sum(){
    var x,y,z;
    x = Number(document.getElementById("input1").value);
    y = Number(document.getElementById("input2").value);
    z = x + y;
    document.getElementById("result").innerHTML = z ;
}
Soham Das
źródło
1

Możesz użyć parseIntdo przeanalizowania ciągu do liczby. Aby być po bezpiecznej stronie, zawsze przekazuj 10jako drugi argument do analizy o podstawie 10.

num1 = parseInt(num1, 10);
num2 = parseInt(num2, 10);
alert(num1 + num2);
Alex Turpin
źródło
1

Upewnij się, że zaokrągliłeś ostateczną odpowiedź do mniej niż 16 miejsc po przecinku dla liczb zmiennoprzecinkowych, ponieważ skrypt java zawiera błędy.

Na przykład 5 - 7,6 = -2,5999999999999996

Nicolas
źródło
1
JavaScript nie zawiera błędów, używa tego samego zmiennoprzecinkowego IEEE754, co większość innych elementów. Zanotowana niedokładność jest naturalną konsekwencją stosowania binarnej arytmetyki zmiennoprzecinkowej na liczbach, które określasz i wyświetlasz w postaci dziesiętnej.
Michael Geary,
1

@ cr05s19xx zasugerował na zduplikowane pytanie:

JavaScript jest trochę zabawny, jeśli chodzi o liczby i dodawanie.

Podając następujące

„20” - „30” = 10; // zwraca 10 jako liczbę '20' + '30' = '2030'; // Zwraca je jako ciąg znaków Wartości zwracane z document.getElementById są ciągami, więc lepiej jest je wszystkie (nawet działające) przeanalizować jako liczbę, zanim przystąpisz do dodawania lub odejmowania. Twój kod może być:

function myFunction() {
  var per = parseInt(document.getElementById('input1').value);
  var num = parseInt(document.getElementById('input2').value);
  var sum = (num / 100) * per;
  var output = num - sum;

  console.log(output);

  document.getElementById('demo').innerHTML = output;
}

function myFunction2() {
  var per = parseInt(document.getElementById('input3').value);
  var num = parseInt(document.getElementById('input4').value);
  var sum = (num / 100) * per;
  var output = sum + num;

  console.log(output);

  document.getElementById('demo1').innerHTML = output;
}
Gary
źródło
0

Użyj parseFloatmetody, aby przeanalizować ciągi na liczby zmiennoprzecinkowe:

parseFloat(num1) + parseFloat(num2)
Guffa
źródło
0

Używam tego w moim projekcie, używam znaku +, aby traktować ciąg jako liczbę (w zmiennej with_interesst)

<script>
function computeLoan(){
var amount = document.getElementById('amount').value;
var interest_rate = document.getElementById('interest_rate').value;
var days = document.getElementById('days').value;
var interest = (amount * (interest_rate * .01)) / days;
var payment = ((amount / days) + interest).toFixed(2);
var with_interest = (amount * (interest_rate * .01));
var with_interesst = (+amount * (interest_rate * .01)) + (+amount);
payment = payment.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.getElementById('payment').innerHTML = "Target Daily = PHP"+payment;
document.getElementById('with_interesst').innerHTML = "Amount w/Interest =   PHP"+with_interesst;
}
</script>

<div name="printchatbox" id="printchatbox">
 <form id="Calculate" class="form-horizontal">
   <h2>You Can Use This Calculator Before Submit </h2>
   <p>Loan Amount: PHP<input id="amount" type="number" min="1" max="1000000"  onchange="computeLoan()"></p>
   <p>Interest Rate: <input id="interest_rate" type="number" min="0" max="100" value="10" step=".1" onchange="computeLoan()">%</p>
    <p>Term<select id="days" type="number" min="1" max="72" step=".1" onchange="computeLoan()">
    <option value="40">40 Days</option>
    <option value="50">50 Days</option>
    <option value="60">60 Days</option>
    <option value="70">70 Days</option>
    <option value="80">80 Days</option>
    <option value="90">90 Days</option>
    <option value="100">100 Days</option>
    <option value="120">120 Days</option>
    </select>
    </p>                        
   <h2 id="payment"></h2>
   <h2 id ="with_interesst"></h2>
 </form>
</div>

Mam nadzieję, że to pomoże


źródło
0
document.getElementById(currentInputChoosen).value -= +-100;

Działa w moim przypadku, jeśli napotkasz taki sam problem jak ja i nie możesz znaleźć rozwiązania dla tego przypadku i znaleźć to pytanie SO.

Przepraszam za trochę nie na temat, ale kiedy właśnie się dowiedziałem, że to działa, pomyślałem, że warto się tym podzielić.

Nie wiem, czy jest to brudne obejście, czy faktycznie legalne.

rzymski
źródło
-1

Możesz użyć w ten sposób:

var num1 = '20',
    num2 = '30.5';

alert((num1*1) + (num2*1)); //result 50.5

Gdy zastosujesz * 1 w num1, zamień ciąg na liczbę.

jeśli num1 zawiera literę lub przecinek, zwraca wartość NaN pomnożoną przez 1

jeśli num1 ma wartość null, num1 zwraca 0

Z poważaniem!!!

Seconddj
źródło
-2

Spróbuj tego, jeśli szukasz prostego kodu JavaScript i chcesz użyć dwóch pól wejściowych i dodać liczby z dwóch wartości. Oto kod.

    Enter the first number: <input type="text" id="num1" /><br />
    Enter the seccond number: <input type="text" id="num2" /><br />
    <input type="button" onclick="call()" value="Add"/>

    <script type="text/javascript">
    function call(){
    var q=parseInt(document.getElementById("num1").value);
    var w=parseInt(document.getElementById("num2").value);
    var result=q+w;
    }
    </script>

Aby uzyskać więcej informacji, odwiedź http://informativejavascript.blogspot.nl/2012/12/javascript-basics.html

kamal
źródło