Autor Zpráva
xlifer
Profil
Jak udělat v javascriptu součet čísel?

Např. 5+2 = 7

Udělá se mi z toho "52", tzn. jen se to spojí jako řetězec... Zkoušel jsem eval(5+2), to funguje, ale problém je ještě v tom, že chci v cyklu navyšovat o různé hodnoty:

vysledek = 0;
vysledek += 5;
vysledek += 2;

Správně by měl být vysledek=7, ale udělá to zase "052"

Tady nevím jak použít ten eval do toho a zda to vůbec lze?
Zechy
Profil
Bohužel na to, abych si to ověřil je Chrome už moc chytrý. Ale můžeš ta jednotlivá čísla prohnat přes parseInt(); před součtem.
Bubák
Profil
xlifer:
Jak udělat v javascriptu součet čísel?
Já bych začal přečtením Časté potíže, zajímavosti a poučné debaty » Součet čísel versus součet řetězců.
xlifer
Profil
Bubák:

Děkuji moc.... Použil jsem "Number" a pomohlo, ale učitě je alternativa i jak píše Zechy, akorat parseInt pracuje asi moc chytře, takže může způsobit i případné nepřesné součty... takže raději asi přes Number to vypadá jistější:

vysledek = 0;
vysledek += Number(5);
vysledek += Number(2);
_es
Profil
xlifer:
Nejako píšeš nezmysly. Buď do premennej vysledek nepriraďuješ číslo 0, ale textový reťazec "0", alebo k premennej vysledek nepripočítavaš čísla, ale textové reťazce. Sčítaním dvoch čísel textový reťazec naozaj nevznikne: jsfiddle.net/3xna9
juriad
Profil
V JS jsou tři operátory plus:
- unární aritmetický, který pro čísla nedělá nic a řetězec převede na číslo, tedy
+5 // číslo 5
+"15" // číslo 15
- binární aritmetický - pokud jsou oba argumenty čísla - čísla sečte, tedy
5 + 15 // číslo 20
- binární řetězcový - pokud alespoň jeden argument není číslo - převede argumenty na řetězce a ty spojí za sebe, tedy
5 + "15" // řetězec "515"
"5" + 15 // řetězec "515"
"5" + "15" // řetězec "515"

Operátory plus rovná se jsou dva:
- binární aritmetický - pokud je levý argument proměnná obsahující číslo a pravý číslo, tedy:
var x = 5; x += 15; // x je číslo 20
- binární řetězcový - pokud je je levý argument proměnná obsahující řetězec nebo pravý řetězec, tedy:
var x = 5; x += '15'; // x je řetězec "515"
var x = '5'; x += 15; // x je řetězec "515"
var x = '5'; x += '15'; // x je řetězec "515" 

Tedy, tvůj výpočet se neprovádí operátorem binárním aritmetickým, jak bys chtěl, ale z nějakého důvodu operátorem binárním řetězcovým. Důvod může být jediný: to, o čem jsi přesvědčený, že je číslo, číslo není.
Zechy
Profil
juriad:
Todle většinou zapříčinuje to, že právě v jeho případě je číslo nahráváno z "alertu". Pamatuju, že todle jsme zkoušeli na webovkách ve druháku a tam jsme právě museli číslo ošetřit parseInt().
Chamurappi
Profil
Reaguji na Zechyho:
Bohužel na to, abych si to ověřil je Chrome už moc chytrý.
Cože? Nechápu.

je číslo nahráváno z "alertu"
Spíš z <input>u.



Reaguji na xlifera:
akorat parseInt pracuje asi moc chytře, takže může způsobit i případné nepřesné součty
Tohle také nechápu. Metoda parseInt přijímá řetězec (co jím není, na řetězec se převede) a vrací celé číslo.

vysledek += Number(5);
V tomto případě je Number zbytečné, 5 už je číslo.


Reaguji na juriada:
unární aritmetický, který pro čísla nedělá nic a řetězec převede na číslo
Jen podotknu, že se provádí přesně stejný převod, jako při použití Number. A vstupem může být cokoliv, nejen číslo či řetězec.

pokud alespoň jeden argument není číslo - převede argumenty na řetězce
Ta podmínka je stavěná naopak — pokud alespoň jeden argument je řetězec. Třeba 5 + true vrací 6, ne "5true".
Zechy
Profil
Chamurappi:
Spíš z <input>u.
Jo, splet jsem si to s minulým problémem, kde to nahrávala z toho vyskakovacího okénka.

Cože? Nechápu.
Co jsem zkoušel si to nějak odsimulovat, tak v žádném případě mi to chrome nesebral jako string, ale okamžitě to bral jako číslo. Možná jsem šel na to špatně.
Joker
Profil
Zechy:
v žádném případě mi to chrome nesebral jako string, ale okamžitě to bral jako číslo
Řetězce se v JS zapisují do uvozovek.
var a = 5 + 2; // 7
var b = "5" + "2"; // 52
Tak jak to napsal xlifer v [#1] to samozřejmě fungovat bude, jenže on (podle kontextu) ve skutečnosti načítá hodnotu <input> pole, což je řetězec.

Chamurappi:
Tohle také nechápu.
Možná ho mate, že parseInt umí různé číselné soustavy a podobně?
Zechy
Profil
Joker:
Nezkoušel jsem si definovat proměnné, ale přímo vstup z vyskakovacího okna.
Chamurappi
Profil
Reaguji na Zechyho:
v žádném případě mi to chrome nesebral jako string
Tvá odpověď naznačovala, že se chování může lišit v závislosti na prohlížeči, což je nebezpečný omyl. Nikdy žádný prohlížeč nesčítal skutečná čísla jako řetězce. V práci s datovými typy panuje už od dávných časů dokonalá souhra.

ale přímo vstup z vyskakovacího okna
Tím myslíš prompt? Ten vrací vždy řetězec, takže bys nikdy neměl narazit na aritmetické sčítání.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: