Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki JavaScript

Słowa kluczowe: JavaScript parseInt() w JavaScript

W języku JavaScript zdefiniowana zmienna i, która ma przechowywać wynik dzielenia wynoszący 1, to

A. var i=3/2;
B. var i=Number(3/2);
C. var i=parseFloat(3/2);
D. var i=parseInt(3/2);

Pytanie z egzaminu CKE, styczeń 2018 (arkusz E.14-X-18.01).

W tym pytaniu kluczowe jest to, że JavaScript domyślnie wykonuje dzielenie zmiennoprzecinkowe. Wyrażenie 3/2 daje wynik 1.5, a nie 1, bo typ Number w JavaScript przechowuje liczby jako wartości zmiennoprzecinkowe zgodne z IEEE 754. Zapis var i=parseInt(3/2); powoduje najpierw obliczenie 3/2, czyli 1.5, a potem parseInt usuwa część ułamkową i zwraca 1. Czyli zmienna i dostaje wartość całkowitą 1. Warto pamiętać, że parseInt nie zaokrągla, tylko obcina zapis od miejsca, gdzie kończy się poprawna liczba całkowita. Przykładowo parseInt(1.9) też da 1. Moim zdaniem w praktycznym, nowoczesnym kodzie lepiej byłoby użyć Math.trunc(3/2), bo to jaśniej pokazuje intencję obcięcia części ułamkowej. Dodatkowo zamiast var często stosuje się let albo const, zgodnie z dobrymi praktykami ECMAScript. Jednak w kontekście podanych odpowiedzi to właśnie parseInt(3/2) jako jedyne prowadzi do wyniku 1.
W JavaScript trzeba uważać na to, że samo dzielenie liczb nie działa jak dzielenie całkowite znane z niektórych innych języków programowania. Gdy zapiszesz var i=3/2;, interpreter obliczy wartość 1.5, ponieważ operator / zawsze zwraca zwykły wynik liczbowy, a typ Number obsługuje część ułamkową. To częsty błąd myślowy: ktoś zakłada, że skoro dzielimy dwie liczby całkowite, to wynik też będzie całkowity. W JS tak nie jest.

Użycie Number(3/2) też nie zmienia sytuacji. Funkcja Number służy głównie do konwersji wartości na typ liczbowy, na przykład tekstu '123' na liczbę 123. Tutaj 3/2 już jest liczbą, dokładniej 1.5, więc Number tylko zachowuje tę wartość. Podobnie parseFloat(3/2) nie pomoże, bo parseFloat właśnie zachowuje liczby zmiennoprzecinkowe, czyli w praktyce nadal dostaniesz 1.5. Nazwa może trochę mylić, bo wygląda technicznie i kojarzy się z przetwarzaniem, ale ona nie robi z wyniku liczby całkowitej.

Jeżeli celem jest otrzymanie 1, trzeba usunąć część ułamkową. W podanych odpowiedziach robi to parseInt(3/2). Trzeba tylko wiedzieć, że w profesjonalnym kodzie do operacji matematycznych częściej używa się Math.trunc, Math.floor albo Math.round, zależnie od tego, czy chcemy obcinać, zaokrąglać w dół czy do najbliższej liczby. parseInt jest bardziej funkcją do parsowania tekstu, więc w większym projekcie warto dobrać narzędzie świadomie, a nie tylko dlatego, że akurat daje oczekiwany wynik.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.