Materiał edukacyjny · Informatyka JavaScript w przeglądarce · Moduł 09

MODUŁ 09

Obliczenia kosztów, rabaty i podsumowania

PPrezentacja dla nauczyciela

Tworzenie interaktywnych kalkulatorów wycen, koszyków zakupowych i konfiguratorów usług to jedno z najczęstszych zadań programistycznych. W tym module opanujesz precyzyjne operacje na kwotach, naliczanie progów rabatowych oraz dynamiczne sumowanie wielu zaznaczonych pozycji.

Pobieranie danych liczbowych i kalkulacja kwot

Kalkulatory cenowe na stronach internetowych bazują na prostych operacjach arytmetycznych: mnożeniu liczby zamówionych jednostek przez stawkę jednostkową oraz sumowaniu pozycji składowych. Wartości pobierane z kontrolek formularza zawsze odczytujemy jako tekst, dlatego pierwszym krokiem skryptu musi być konwersja na typ liczbowy za pomocą Number() lub parseFloat().

Chociaż operator mnożenia (*) w JavaScript potrafi niejawnie przekształcić łańcuchy cyfr na liczby, pominięcie jawnego rzutowania prowadzi do trudnych do wykrycia błędów, gdy w kolejnym kroku zechcemy dodać do siebie dwie kwoty (operator + zinterpretuje je jako łączenie tekstów).

Końcowy wynik finansowy należy sformatować za pomocą metody kwota.toFixed(2). Zwraca ona łańcuch znaków z dokładnie dwoma miejscami po przecinku, gwarantując czytelną i profesjonalną prezentację sumy (np. 68.00 zł zamiast 68 zł lub wartości z drobnymi niedokładnościami zmiennoprzecinkowymi).

function obliczBilety() {
  const normalne = Number(document.getElementById('biletyNormalne').value);
  const ulgowe = Number(document.getElementById('biletyUlgowe').value);
  const wynik = document.getElementById('wynikBiletow');

  const kosztNormalne = normalne * 25;
  const kosztUlgowe = ulgowe * 18;
  const razem = kosztNormalne + kosztUlgowe;

  wynik.textContent = 'Do zapłaty: ' + razem.toFixed(2) + ' zł';
}
1. Jaka metoda służy do sformatowania liczby z dokładnością do dwóch miejsc po przecinku w postaci tekstu?
2. Co stanie się, gdy zmienna przechowująca liczbę sztuk zostanie pomnożona przez cenę jednostkową, jeśli obie były typu string zawierającego cyfry?
3. Dlaczego pomimo niejawnej konwersji przy mnożeniu zaleca się zawsze jawne rzutowanie Number(pole.value)?

Warunkowe naliczanie rabatów i zniżek

W wielu systemach zamówień ostateczna cena zależy od spełnienia określonych kryteriów, takich jak wielkość zamówienia czy posiadanie karty lojalnościowej. Do wyznaczenia stawki rabatowej stosuje się instrukcje warunkowe if / else if / else.

Procenty w kodzie JavaScript zapisujemy w postaci ułamków dziesiętnych: rabat 10% odpowiada mnożnikowi 0.10, a 25% to 0.25. Kwotę zaoszczędzoną obliczamy przez pomnożenie ceny bazowej przez stawkę rabatu: kwotaZnizki = cenaBazowa * rabat, po czym odejmujemy ją od sumy początkowej.

Jeżeli rabaty mogą się kumulować (np. upust za liczbę sztuk plus dodatkowy bonus za posiadanie karty stałego klienta), wygodnie jest zainicjować zmienną rabatu o wartości początkowej 0, a następnie zwiększać ją za pomocą operatora += po spełnieniu każdego z warunków.

function obliczRabatHurtowy() {
  const sztuki = Number(document.getElementById('liczbaSztuk').value);
  const maKarte = document.getElementById('kartaKlienta').checked;
  const wynik = document.getElementById('wynikRabatu');

  const cenaBazowa = sztuki * 40;
  let rabat = 0;

  if (sztuki >= 20) {
    rabat += 0.20;
  } else if (sztuki >= 10) {
    rabat += 0.10;
  }

  if (maKarte) {
    rabat += 0.05;
  }

  const wartoscRabatu = cenaBazowa * rabat;
  const cenaKoncowa = cenaBazowa - wartoscRabatu;

  wynik.textContent = 'Cena: ' + cenaKoncowa.toFixed(2) + ' zł (rabat: ' + (rabat * 100) + '%, oszczędzasz ' + wartoscRabatu.toFixed(2) + ' zł)';
}
4. W jaki sposób obliczyć 15-procentowy rabat od kwoty zapisanej w zmiennej cenaBazowa?
5. Jak zapisać warunek sprawdzający, czy liczba sztuk mieści się w przedziale od 10 do 49 włącznie?
6. Jeżeli zamówienie kwalifikuje się do rabatu 10%, a posiadacz karty otrzymuje dodatkowe 5%, to jak ustalić łączną zniżkę w zmiennej let rabat = 0?

Sumowanie usług dodatkowych i wielokrotnego wyboru

Gdy formularz pozwala na wybór dowolnej liczby opcji dodatkowych (np. usług serwisowych, ubezpieczenia czy akcesoriów), ręczne sprawdzanie każdego checkboxa osobną instrukcją if staje się nieefektywne. Wygodniejszym podejściem jest przechowywanie kosztu w atrybucie danych data-cena każdego znacznika HTML.

W kodzie JavaScript pobieramy wszystkie aktualnie zaznaczone kontrolki za pomocą selektora pseudoklasy: document.querySelectorAll('.dodatek:checked'). Zwraca on kolekcję NodeList, po której możemy przejść pętlą forEach.

Przed pętlą deklarujemy zmienną akumulatora (np. let suma = kosztDiagnozy;), a w każdym obiegu pętli odczytujemy wartość z pole.dataset.cena, rzutujemy ją na liczbę za pomocą Number() i dodajemy do sumy całkowitej. Taki mechanizm jest w pełni elastyczny i działa poprawnie niezależnie od tego, ile pozycji zaznaczy użytkownik.

function policzKosztSerwisu() {
  const kosztDiagnozy = 80;
  let suma = kosztDiagnozy;

  const wybraneUslugi = document.querySelectorAll('.dodatek:checked');

  wybraneUslugi.forEach(function(pole) {
    const cenaDodatku = Number(pole.dataset.cena);
    suma += cenaDodatku;
  });

  const wynik = document.getElementById('wynikSerwisu');
  wynik.textContent = 'Całkowity koszt naprawy: ' + suma.toFixed(2) + ' zł (wybrano dodatków: ' + wybraneUslugi.length + ')';
}
7. Jaka technika pozwala przechować sumę kosztów przy iterowaniu po zaznaczonych polach wyboru?
8. W jaki sposób odczytać atrybut data-cena z zaznaczonego pola pobranego w pętli forEach?
9. Co zwróci selektor document.querySelectorAll('.dodatek:checked'), jeśli użytkownik nie zaznaczył żadnego pola?

Ćwiczenia