Math.floor() w JavaScript - Zaokrąglanie liczb bez błędów?

Arkusz kalkulacyjny z danymi i formułami, w tym `math floor js` w postaci `ROUND(SUM(A2:A4),2)`.

Napisano przez

Jacek Zając

Opublikowano

26 maj 2026

Spis treści

Zaokrąglanie liczb w JavaScript wygląda banalnie, dopóki nie trafisz na wartości ujemne, ceny z groszami albo generowanie losowych indeksów. Math.floor() rozwiązuje dokładnie ten rodzaj problemów: sprowadza liczbę do największej liczby całkowitej mniejszej lub równej podanej wartości. W tym artykule pokazuję, jak działa w praktyce, kiedy wybrać ją zamiast innych metod i jak uniknąć błędów, które w kodzie pojawiają się zaskakująco często.

Najważniejsze zasady działania Math.floor()

  • Zwraca liczbę całkowitą mniejszą lub równą wejściu, więc dla dodatnich wartości działa jak obcięcie części po przecinku.
  • Dla liczb ujemnych nie ucina do zera - wynik przesuwa się w stronę bardziej ujemnej wartości.
  • Nie jest tym samym co Math.round() ani Math.trunc(), a ta różnica ma znaczenie w kodzie produkcyjnym.
  • Świetnie sprawdza się przy losowaniu indeksów, dzieleniu na koszyki i mapowaniu wartości na siatkę.
  • W obliczeniach finansowych lepiej uważać na liczby zmiennoprzecinkowe i pracować na najmniejszych jednostkach, np. groszach.

Czym jest Math.floor() i co zwraca

Math.floor() jest statyczną metodą obiektu Math, więc używa się jej zawsze w formie Math.floor(liczba). Zwracany wynik nadal ma typ number, ale bez części ułamkowej. W praktyce oznacza to, że dla liczb dodatnich zachowuje się jak obcięcie po przecinku, ale dla liczb ujemnych już nie: tu wynik przesuwa się w dół na osi liczbowej.

Math.floor(7.9);   // 7
Math.floor(7.1);   // 7
Math.floor(7);     // 7
Math.floor(-7.1);  // -8
Math.floor(-7.9);  // -8

To właśnie ta różnica sprawia, że ta funkcja bywa niedoceniana przez początkujących, a potem ratuje w miejscach, gdzie trzeba pilnować limitów, przedziałów albo indeksów tablic. Żeby zobaczyć, dlaczego ujemne wartości potrafią zaskoczyć, trzeba spojrzeć na sam kierunek zaokrąglania.

Jak zachowuje się dla liczb dodatnich i ujemnych

Najprościej myśleć o Math.floor() jak o ruchu w stronę minus nieskończoności. Dla dodatnich liczb efekt wygląda niewinnie, bo 4.9 staje się 4, ale przy wartościach ujemnych nie ma już „ucięcia do zera” - -4.1 staje się -5, a nie -4.

Wartość wejściowa Wynik Co się dzieje
4.9 4 Funkcja usuwa część ułamkową i nie przekracza granicy.
-4.1 -5 Wynik idzie w dół, czyli dalej od zera.
-4.0 -4 Liczba całkowita pozostaje bez zmian.
-0.1 -1 To najczęstszy punkt zaskoczenia przy pierwszym kontakcie z floor.

Ja lubię zapamiętywać jedną regułę: jeśli liczba jest dodatnia, floor() wygląda jak zwykłe obcięcie; jeśli jest ujemna, trzeba myśleć o osi liczbowej, a nie o samym przecinku. Gdy ta zasada jest już jasna, łatwiej dobrać właściwą metodę zaokrąglania do konkretnego zadania.

Kiedy wybrać floor, ceil, round albo trunc

W projektach nie chodzi o to, żeby znać nazwę funkcji, tylko żeby dobrać ją do celu. Ja najczęściej rozróżniam te cztery metody tak: jedna pilnuje dolnego limitu, druga górnego, trzecia wybiera najbliższą wartość, a czwarta po prostu odcina część ułamkową.

Funkcja Co robi Kiedy użyć Na co uważać
Math.floor() Zaokrągla w dół do największej liczby całkowitej mniejszej lub równej wynikowi. Gdy nie wolno przekroczyć limitu, np. przy indeksach, koszykach, przedziałach. Przy liczbach ujemnych wynik może być bardziej ujemny, niż się spodziewasz.
Math.ceil() Zaokrągla w górę do najmniejszej liczby całkowitej większej lub równej wynikowi. Gdy chcesz domknąć brakujące miejsce, np. liczbę stron, paczek albo pudełek. Nie używaj go tam, gdzie wynik ma pozostać poniżej limitu.
Math.round() Zaokrągla do najbliższej liczby całkowitej. Gdy zależy Ci na najbardziej naturalnym wyniku dla człowieka. Przy liczbach ujemnych i dokładnie połówkowych warto sprawdzić zachowanie funkcji.
Math.trunc() Odcina część ułamkową bez zmiany kierunku na osi liczbowej. Gdy chcesz po prostu usunąć część dziesiętną, bez „schodzenia” niżej. To nie jest to samo co floor() dla wartości ujemnych.

Najważniejsza różnica praktyczna jest między floor() a trunc(): przy dodatnich liczbach wyglądają podobnie, ale przy ujemnych dają inny wynik. Jeśli liczysz coś „od zera” i nie chcesz, aby minus przewracał logikę, ten detal ma znaczenie. To właśnie dlatego warto zobaczyć kilka realnych zastosowań zamiast patrzeć na same definicje.

Najpraktyczniejsze zastosowania w JavaScript

Tu Math.floor() zaczyna się naprawdę opłacać. Najczęściej używam jej wtedy, gdy wynik ma trafić do całkowitego przedziału, a nie do „prawie całkowitej” wartości.

Zastosowanie Przykładowy wzór Dlaczego to działa
Losowy indeks tablicy Math.floor(Math.random() * arr.length) Math.random() zwraca wartość mniejszą od 1, więc wynik zawsze mieści się w zakresie 0 do length - 1.
Dzielenie na koszyki Math.floor(score / 10) Wynik grupuje wartości w przedziały, np. 0-9, 10-19, 20-29.
Mapowanie na siatkę Math.floor(x / cellSize) Pozycja pikselowa staje się numerem komórki albo kafelka.
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

Ten wzór daje zakres minmax włącznie, bo Math.random() zwraca wartość mniejszą od 1, a Math.floor() zamienia ją na pełną liczbę całkowitą. Widzisz tu też ważną rzecz: do liczenia liczby stron w paginacji zwykle lepsze jest Math.ceil(), bo ostatnia niepełna strona też musi się pojawić. Jeśli potrzebujesz nie całych jednostek, tylko obcięcia do określonego miejsca po przecinku, dochodzi jeszcze jeden krok.

Jak zaokrąglać do części dziesiętnych bez psucia wyniku

Math.floor() działa na całej liczbie, ale czasem trzeba zejść tylko do dwóch miejsc po przecinku albo do jednego miejsca po przecinku. Wtedy stosuję prosty schemat: mnożenie, floor, dzielenie. To działa dobrze w wielu sytuacjach technicznych, na przykład przy progach cenowych, pomiarach czy wartościowaniu wyników.

const value = 12.349;
const floorTo2 = Math.floor(value * 100) / 100; // 12.34
const floorTo1 = Math.floor(value * 10) / 10;    // 12.3

Trzeba jednak pamiętać o jednym ograniczeniu: JavaScript używa liczb zmiennoprzecinkowych, więc przy precyzyjnych obliczeniach, zwłaszcza finansowych, mogą pojawić się minimalne odchylenia. W projektach związanych z pieniędzmi ja wolę trzymać kwoty w najmniejszych jednostkach, na przykład w groszach, zamiast ciągle mnożyć i dzielić liczby dziesiętne. Kiedy zaczynasz tak przeliczać wartości, pojawiają się jeszcze przypadki graniczne, które warto znać zawczasu.

Najczęstsze błędy i przypadki graniczne

Najwięcej problemów nie robi sama funkcja, tylko założenia, które projektujemy wokół niej. Warto zapamiętać kilka rzeczy, bo one wracają w code review zaskakująco często:

  • Math.floor(NaN) zwraca NaN, więc najpierw trzeba zadbać o poprawność wejścia.
  • Infinity i -Infinity zostają bez zmian, bo nie są zwykłymi liczbami z częścią ułamkową.
  • Math.floor(-0.1) daje -1, a nie 0.
  • Math.floor() nie zaokrągla do najbliższej liczby, więc nie zastępuje Math.round().
  • Przy pieniądzach lepiej myśleć w najmniejszych jednostkach, bo mnożenie i dzielenie liczb zmiennoprzecinkowych może wprowadzać drobne błędy.

Jeśli chcesz tylko obciąć część dziesiętną bez zmiany kierunku na osi liczbowej, wtedy sprawdzasz, czy nie lepszy będzie Math.trunc(). Z takim zestawem reguł łatwiej używać tej funkcji świadomie, zamiast zgadywać, co zrobi z danym wynikiem.

Co warto zapamiętać, zanim wstawisz floor do projektu

Ja zapamiętuję Math.floor() jako narzędzie do sytuacji, w których wynik nie może przekroczyć granicy: indeksów, bucketów, zakresów i prostych przeliczeń na całkowite jednostki. Jeśli masz liczbę dodatnią, funkcja zachowuje się intuicyjnie; jeśli wejście może być ujemne, trzeba myśleć o kierunku na osi liczbowej, a nie o samym „obcięciu”.

W praktyce to właśnie ten drobny detal odróżnia kod poprawny od kodu, który tylko wygląda poprawnie w testach na dodatnich liczbach. Gdy to rozróżnienie masz już opanowane, dobór między floor(), ceil(), round() i trunc() przestaje być zgadywaniem, a staje się prostą decyzją techniczną.

FAQ - Najczęstsze pytania

Math.floor() zaokrągla w dół do najbliższej liczby całkowitej (w stronę minus nieskończoności). Math.round() zaokrągla do najbliższej liczby całkowitej (standardowo). Math.trunc() po prostu odcina część dziesiętną, nie zmieniając kierunku na osi liczbowej, co daje inny wynik dla liczb ujemnych niż floor().

Nie. Dla liczb dodatnich Math.floor() działa jak obcięcie części dziesiętnej (np. 7.9 staje się 7). Dla liczb ujemnych zaokrągla w dół, czyli w stronę bardziej ujemnej wartości (np. -7.1 staje się -8, a nie -7).

Math.floor() jest idealne, gdy potrzebujesz dolnego limitu, np. do obliczania indeksów tablicy (Math.floor(Math.random() * arr.length)), dzielenia wartości na koszyki, czy mapowania pozycji na siatkę. Zapewnia, że wynik nigdy nie przekroczy określonej granicy.

Aby zaokrąglić do N miejsc po przecinku, pomnóż liczbę przez 10^N, zastosuj Math.floor(), a następnie podziel wynik przez 10^N. Np. dla dwóch miejsc: Math.floor(value * 100) / 100. Pamiętaj o precyzji liczb zmiennoprzecinkowych w JavaScript.

Math.floor(NaN) zwróci NaN. Wartości Infinity i -Infinity pozostaną bez zmian, ponieważ nie są to liczby z częścią ułamkową, które mogłyby zostać zaokrąglone. Zawsze warto zadbać o poprawność danych wejściowych.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

math floor js math.floor javascript math.floor liczby ujemne math.floor a math.trunc math.floor zastosowania

Udostępnij artykuł

Jacek Zając

Jacek Zając

Nazywam się Jacek Zając i od dziewięciu lat zajmuję się programowaniem webowym. Moja przygoda z tą dziedziną zaczęła się od fascynacji tworzeniem stron internetowych, co szybko przerodziło się w pasję do nauczania innych. Lubię dzielić się wiedzą i pomagać osobom, które stawiają pierwsze kroki w programowaniu. Skupiam się na wyjaśnianiu złożonych zagadnień w przystępny sposób, aby każdy mógł zrozumieć podstawy i rozwijać swoje umiejętności. W moich artykułach poruszam różnorodne tematy związane z programowaniem webowym, od HTML i CSS po JavaScript i frameworki. Dokładam wszelkich starań, aby informacje, które prezentuję, były rzetelne, aktualne i łatwe do przyswojenia. Regularnie śledzę nowinki w branży, co pozwala mi na dostarczanie czytelnikom treści zgodnych z najnowszymi trendami. Wierzę, że dobrze zorganizowana wiedza to klucz do sukcesu w karierze programisty.

Napisz komentarz