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.
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.