Number i Math

Number - czyli typ danych pozwalający pracować na liczbach.

W większości przypadków będziemy zapisywać liczby normalnie - tak jak się przyzwyczailiśmy:

const nr1 = 102;
const nr2 = 1.25;

Jeżeli chcemy zapisać liczbę z większą liczbą zer, możemy to zrobić normalnie powtarzając kolejne zera, ale też możemy zastosować zapis z literą e, po której podajemy liczbę zer. Dzięki temu ciężej zrobić błąd:

const nr1 = 1e6; //1 * 1000000
const nr2 = 2e5; //2 * 100000
const nr3 = 1.3e4; //1.3 * 10000

Podobną techniką możemy zapisywać liczby bardzo małe:

const nr1 = 1e-5; //5 zer na lewo od liczby => 0.00001
const nr2 = 2e-3; //3 zera na lewo 0.002
const nr3 = 2.1e-4; //4 zera na lewo 0.00021

Kolejnym sposobem zapisu liczb jest system dwójkowy, hexadecymalny oraz ósemkowy. Nie są to zapisy często używane, ale w skrajnych sytuacjach może się pojawić:

//szesnastkowy - znany z kolorów CSS
console.log(0xFF); //255
console.log(0x66); //102

//ósemkowy
const nr1 = 0o377; //255

//dwójkowy
const nr2 = 0b11111111; //255

console.log(0xFF === 0o377, 0o377 === 0b11111111, 0xFF === 0b11111111); //true, true, true

Funkcja toString()

Każdy (prawie) typ danych w Javascript może korzystać z funkcji toString(), która zamienia go na zapis tekstowy. W przypadku typu Number, metoda ta pozwala podać w nawiasach podstawę/system (z zakresu 2-36), która zostanie użyta do reprezentacji danej liczby:

Niedokładne liczenie

Rozważmy proste równanie:

Z czego wynika tak dziwny wynik?

Komputery to twory, które przechowują dane w formie bitów, czyli zapisie zer i jedynek (tak zwany system dwójkowyarrow-up-right).

Część liczb niestety nie jest możliwa do przedstawienia w tym systemie.

Można to przyrównać do używanego na co dzień systemu dziesiętnego.

Przykładowo ułamek ½ możemy w systemie dziesiętnym zapisać jako 0.5. Podobnie ułamek ¼ zapiszemy jako 0.25.

Gdybyśmy podobnie chcieli zapisać ułamek ⅓, okazało by się, że nie jesteśmy tego w 100% zrobić, ponieważ nigdy nie osiągniemy pełnej precyzji 0.33333...

Podobnie w systemie dwójkowym niektórych liczb nie jesteśmy w stanie zapisać.

Problem ten tyczy się wszystkich obecnych komputerów i spotykany jest w wielu językach (np. Perl. C++, Java, PHP) ale też i w grach.

W przypadku Javascript do zapisu liczb w pamięci wykorzystywany jest używany powszechnie standard IEEE_754arrow-up-right, który charakteryzuje się tym, że przy operacjach na liczbach o bardzo małej precyzji, zaokrąglane są one do najbliższej możliwej do zapisu w systemie dwójkowym liczby.

W 99.9999% przypadków nie będzie to miało dla nas znaczenia i prawdopodobnie przy normalnej pracy nigdy się z nim nie zetkniesz. Jeżeli jednak kiedyś na swojej drodze spotkasz się z zadaniem zrobienia sklepu, który operuje na bilionach krypto monet, pewnie będziesz musiał skorzystać ze specjalnych algorytmówarrow-up-right, które służą do redukcji takich "przesunięć". Na co dzień jednak nie ma co się tym przejmować.

Jeżeli chcesz zobaczyć jak takie dziwactwa wyglądają w innych językach, przejdź na stronę pod znamiennym adresem https://0.30000000000000004.com/arrow-up-right...

Math

JavaScript udostępnia nam obiekt Math, który ułatwia nam przeprowadzanie matematycznych operacji.

Poniżej zamieszczam jego najczęściej używane funkcje. Tak naprawdę nie musisz wszystkich wkuwać na pamięć. Wystarczy otworzyć debugger, wpisać w konsoli Math i nacisnąć enter. Rozwijasz, badasz i masz pełną listę dostępnych funkcjonalności.

Po takim badaniu wystarczy odwiedzić stronę MDNarrow-up-right by doczytać o tym co cię zainteresuje.

Te częściej używane funkcje to:

Math.abs(liczba)

- zwraca wartość bezwzględną (absolutną) liczby

Math.ceil(liczba)

- zwraca najmniejszą liczbę całkowitą, większą lub równą podanej liczbie

Math.floor(liczba)

- zwraca największą liczbę całkowitą mniejszą lub równą podanej liczbie

Math.max(liczba1, liczba2, liczba3...)

- zwraca największą z przekazanych wartości

Math.min(liczba1, liczba2, liczba3...)

- zwraca najmniejszą z przekazanych wartości

Math.pow(liczba1, liczba2)

- zwraca wartość liczby1 podniesionej do potęgi liczby2

Math.random()

- zwraca wartość pseudolosową z przedziału 0 - 1

Math.round(liczba)

- zwraca zaokrąglenie danej liczby do najbliższej liczby całkowitej

Math.sqrt(liczba)

- zwraca pierwiastek kwadratowy liczby

Kilka przykładów zastosowania Obiektu Math (zobacz też w konsoli debuggera):

Losowa liczba z przedziału

Aby wygenerować liczbę losową z przedziału np. 3-7 skorzystaj z poniższego wzoru:

Losowy kolor

Wzór podpatrzony w internecie, ale ciekawie pokazuje zastosowanie powyższych informacji. Aby wygenerować losowy kolor możemy skorzystać z wielu sposobów.

Inna ciekawa sztuczka:

Powyższe sztuczki generują kolory w mojej opinii nieco bure. Aby generować bardziej żywe kolory wystarczy skorzystać z innego formatu czyli hslarrow-up-right:

Last updated