Liczby
Typ liczbowy
W JavaScript mamy tylko 1 typ liczb,
Liczby są reprezentowane przez jeden typnumber
które możemy zapisać jako stałe int ang (int!!!) lub zmiennoprzecinkowe (float)
var age = 23;
var money = 25.90;
Na tę chwilę wiemy, że liczby całkowite mają typnumber
. Co z liczbami rzeczywistymi, czyli takimi, które zawierają część ułamkową? W JavaScript tworzymy je wpisując część całkowitą, następnie kropka a potem część ułamkową.
Sprawdźmy jakiego typu jest zdefiniowana przez nas zmienna.
Np. var a= 12;
typeofa; //"number"
Zmienna którą zdefiniowaliśmy, jest również typunumber
.
Sprawdźmy, jakie konsekwencje niesie za sobą występowanie tylko jednego typu liczbowego.
1
1===1.0
Operator===
sprawdza, czy wartości po obu jego stronach są tego samego typu oraz mają tą samą wartość.
W powyższym przykładzie, liczby1
i1.0
są sobie równe i mają ten sam typ.
Jest to dość unikalna cecha. Musisz pamiętać, że za każdym razem wykonujesz działania na liczbach rzeczywistych.
Na przykład, w jezyku C++ operacja7 / 3
zwróci wartość 2
- część ułamkowa zostanie obcięta. W JavaScript, pomimo tego, że zapis wskazuje na liczby całkowite, działanie zwróci wartość 2.333333333
.
Podstawowe operacje
Liczby można przypisywać do zmiennych. Możemy też dokonywać podstawowych operacji arytmetycznych i wyniki przez nie zwracane przypisywać do zmiennych:
Operatory arytmetyczne
Operator | Nazwa |
---|---|
Dodawanie | + |
Odejmowanie | - |
Mnożenie | * |
Dzielenie | / |
Dzielenie modulo | % |
Inkrementacja, zwiększenie wartości o 1 | ++ |
Dekrementacja, zmniejszenie wartości o 1 | -- |
Dodawanie
Dodawać do siebie można również ciągi znaków, czyli stringi.
var a = 'lorem' + 'Ipsum';
Wartość a to terazloremIpsum.
foo = 'lorem' + 1 + 2;
foo wynosilorem12ponieważ typ zmiennej ustawiony jest najpierw jako string.
foo = 1+2+'lorem';
foowynosi3lorem, ponieważ typ zmiennej ustawiony był jakonumber.
Kilka przykładów znajduje się poniżej.
foo = 'lorem' + ['1', 2, 3.4]; // 'lorem1, 2, 3.4'
foo = ['1', 2, 3.4] + 'lorem'; // '1,2,3.4lorem'
foo = 9 + ['1', 2, 3.4]; // '91,2,3.4'
foo = ['1', 2, 3.4] + 9; // '1,2,3.49'
foo = ['1', 2, 3.4] + [1, '2', 3.4]; // '1,2,3.41,2,3.4'
foo = ['1', 2, 3.4] + {bar: 'lorem'}; // 1, 2, 3.4 [object Object]
foo = {bar: 'lorem'} + [1, '2', 3.4]; // [object Object] 1, 2, 3.4
foo = ['1', 2, 3.4] + undefined; // 1, 2, 3.4 undefined
foo = undefined + [1, '2', 3.4]; // undefined 1, 2, 3.4
Stwórz zmiennąsuma
. Przypisz do niej sumę zmiennycha
ib
. Utwórz także zmiennąmnozenie
z iloczynem zmiennycha
ib
.
Pamiętaj, że suma to wynik dodawania. Iloczyn to wynik mnożenia.
var a = 55;
var b = 40;
var suma = a + b;
var mnozenie = a * b;
Zadanie 2
Stwórz zmiennea
ib
zawierające liczby całkowite. Następnie do zmiennejwynik
wstaw taki wynik dzieleniaa
przezb
, aby liczba w niej przechowywana nie była całkowita. Jeśli chcesz się przekonać, czy interpreter JavaScript dobrze obliczył wynik, możesz go wypisać na ekran.
var a = 55;
var b = 40;
var suma = a + b;
var mnozenie = a * b;
Zapis wykładniczy
Pomnóżmy ze sobą dwie bardzo duże liczby.
Jak widać otrzymaliśmy wartość1e+22
. Jest to zapis wykładniczy.
W powyższym przykładzie jest to po prostu1 * 10^22, gdzie^oznacza potęgowanie.
100000000000
*
100000000000
;
// 1e+22
2e+22
to 2 * 10^223e+20
to 3 * 10^203.3e+4
to 3.3 * 10^4 , czyli 33000
Myślę, że teraz już rozumiesz jak działa zapis wykładniczy.
Jeśli tworzysz zmienne samodzielnie, możesz również używać zapisu wykładniczego, jednak dla liczb, które łatwo zapisać tradycyjnym sposobem raczej nie warto jej używać.
Zadanie 3
Używając zapisu wykładniczego wstaw do zmiennejb
wartość równą wartości zmienneja
.
var a = 190000000000;
var b = 1.9e+11;
var result = (a === b);
Konwersja do typu string
W rozdziale o zmiennych wspomnieliśmy bardzo krótko o typiestring
, który służy do przechowywania ciągów znaków. Ten typ jest szczególnie ważny, bo umożliwia nam wyświetlanie sformatowanych liczb.
Najpierw przekonajmy się o tym, że"128"
nie jest tożsama wartości128
.
!!!
Istnieje oczywiście sposób, żeby zamienić liczbę typunumber
na typstring
. Służy do tego metodatoString()
.
12 | varnum=128;num.toString()==="128";// true |
---|---|
Warto wspomnieć, że metodatoString()
nie modyfikuje zmiennej, a jedynie zwraca jej wartość jakostring
. W powyższym przykładzie zmiennanum
jest dalej typunumber
. Aby zmienić typ zmiennej można przypisać wartość nowego typu do zmiennej, na przykład tak:
12 | varnum=128;num=num.toString(); |
---|---|
Teraz zmiennanum
jest typustring
i zawiera wartość"128"
.
Oczywiście możemy też dokonać zamiany w drugą stronę, służy do tego funkcjaparseInt
. Pobiera ona jako argument ciąg znaków a zwraca liczbę. W przypadku gdy ciąg znaków oprócz cyfr zawiera też litery, na liczbę zostanie przekonwertowana pierwsza możliwa sekwencja.
123 | parseInt('10')===10;// trueparseInt('10 %')===10;// trueparseInt('10 zł.')===10;// true |
---|---|
Ustalanie dokładności
W JavaScript istnieje możliwość wyświetlaniu wartości liczby z określoną ilością miejsc po przecinku. Przydaje się to w przykładach takich jak poniższy.
12 | vara=10/3;a.toString();// "3.3333333333333335" |
---|---|
Rzadko kiedy zależy nam na aż tak dokładnie wyświetlonej wartości. Możemy ją zaokrąglić. Służą do tego metodytoFixed()
oraztoPrecision()
.
MetodatoFixed
służy do ustalenia ile cyfr po przecinku ma mieć dana liczba.
12 | vara=10/3;a.toFixed(2);// "3.33" |
---|---|
MetodatoPrecision
służy do ustalenia ile cyfr ma mieć dana liczba.
12 | vara=10/3;a.toPrecision(2);// "3.3" |
---|---|
Warto wiedzieć, że metodatoPrecision
zlicza liczby dopiero od wystąpienia pierwszej większej od0.
12 | vara=0.03;a.toPrecision(2);// "0.030" |
---|---|
Warto jeszcze zauważyć, że obie powyższe metody zwracają wartości typustring
, oraz podobnie jak metodatoString
, nie modyfikują oryginalnej zmiennej.
Wartości specjalne
W wyniku operacji na liczbach możemy czasami otrzymać dwie wartości specjalne. Jedną z nich jestNaN
, oznaczające “Not-a-Number”. Taką wartość otrzymujemy, gdy wynik działania z jakiegoś powodu nie jest liczbą.
1 | 10*"xyz";// NaN |
---|---|
Zadanie 4
Stwórz zmiennądziwnaZmienna
i wstaw do niej wynik takiego działania, aby zmienna miała wartośćNaN
. Aby było ciekawiej nie możesz użyć mnożenia, tak jak pokazaliśmy w przykładzie.
var dziwnaZmienna = 10 / 'a';
Kolejną wartością specjalną jestInfinity
, czyli nieskończoność. Wartość taką otrzymujemy, gdy nasza liczba wyjdzie poza dostępny zakres. Dodajmy, że taka liczba musi być naprawdę bardzo duża.
1 | 1.7976931348623157E+10308;// Infinity |
---|---|
Zadanie 5
Stwórz zmiennązaDuza
, do której wstawisz wynik takiego iloczynu, aby zmienna miała wartośćInfinity
.
var zaDuza = 1.7976931348623157E+10308;
Jeśli chcesz możesz nie używać zapisu wykładniczego. Warto pamiętać, że zarównoNaN
, jak iInfinity
, są typunumber
.
Problemy z liczbami
W JavaScript występują czasami niespodziewane problemy z liczbami. Można sobie jednak z nimi poradzić.
Jednym z takich problemów jest dzielenie przez 0. Jak wiadomo dzielić przez 0 nie można, dlatego można by się spodziewać, że podczas dzielenia przez 0 zostanie zgłoszony błąd, ewentualnie zwrócona zostanie wartośćNaN
. JavaScript podczas takiego działania zwróci natomiast wartośćInfinity
. Z tego powodu, jeśli wykonujemy dzielenie i nie mamy pewności co do wartości dzielnika, to warto ją sprawdzić.
Przedstawmy teraz kolejny problem. Dodając liczby0.1
i0.2
, można się spodziewać, że otrzymamy liczbę0.3
. Sprawdźmy to.
1 | 0.1+0.2;// 0.30000000000000004 |
---|---|
Jak widać nie otrzymaliśmy0.3
lecz0.30000000000000004
. Jest to błąd języka, który występuje jeszcze w kilku innych przypadkach. Można sobie z nim poradzić używając metodtoPrecision
lubtoFixed
, które już poznaliśmy.
Zadanie 6
Przy użyciu odpowiedniej metody wpisz na ekran poprawny wynik dodawania zmiennycha
ib
.
var a = 0.1;
var b = 0.2;
console.log((a + b).toFixed(1));
Zadanie 7
Celem tego zadania jest obliczenie kwoty, którą trzeba zapłacić w sklepie. Masz daną cenę za kilogramcenaZaKg
, ilość kilogramówiloscKg
oraz rabat w zmiennejrabat
. Wykonując odpowiednie obliczenia, wylicz ile trzeba zapłacić i wstaw tą kwotę do zmiennejdoZaplaty
.
var cenaZaKg = 0.8;
var iloscKg = 1.56;
var rabat = '15%';
var doZaplaty = (cenaZaKg * iloscKg * (1 - parseInt(rabat)/100)).toFixed(2);
NaN
Not a Number, czyli 'to nie jest liczba'. Występuje np. przy mnożeniu liczba razy string.
console.log(10 * 'napis'). // NaN
Infinity
Nieskończoność. W obliczeniach z pewnością wystąpił błąd - dzieje się tak na przykład, gdy spróbujesz dzielić przez zero.