Wydawanie reszty

0

Cześć, mógłbym prosić kogoś o podpowiedź w wykonaniu tego zadania, mam napisać program który wypisze mi monety jakie są potrzebne do wydania reszty, utknąłem na etapie w którym ktoś podaje wysokość reszty (złotowki[spacja]grosze) i gdy podam resztę np 12 00 wszystko dobrze się wypisuje, ale gdy tylko dodam jakieś grosze, program nie zlicza nic.

public static void main(String[] args) {
    
    
   Scanner dane = new Scanner(System.in);
     
    System.out.print("Podaj resztę: ");
     
    double zl = dane.nextDouble();
    double gr = dane.nextDouble();
    
    
    double gr1 = gr / 100;
    double liczba = zl + gr1;
    
    System.out.println("Całość: " + liczba);
    
   
    
   
    double ilosc_5 = 0;
    double ilosc_2 = 0;
    double ilosc_1 = 0;
    double ilosc_0_50 = 0;
    double ilosc_0_20 = 0;
    double ilosc_0_10 = 0;
    double ilosc_0_05 = 0;
    double ilosc_0_02 = 0;
    double ilosc_0_01 = 0;
    
    do
    {
        if (liczba >= (5.00))
        {
            ilosc_5 = Math.floor(liczba / 5.00);
            liczba = liczba % 5.00;
        }
        else if (liczba >= (2.00))
        {
            ilosc_2 = Math.floor(liczba / 2.00);
            liczba = liczba % 2.00;
        }
        else if (liczba >= (1.00))
        {
            ilosc_1 = Math.floor(liczba / 1.00);
            liczba = liczba % 1.00;
        }
        else if (liczba >= (0.50))
        {
            ilosc_0_50 = Math.floor(liczba / (0.50));
            liczba = liczba % (0.50);
        }
        else if (liczba >= (0.20))
        {
            ilosc_0_20 = Math.floor(liczba / (0.20));
            liczba = liczba % (0.20);
        }
        else if (liczba >= (0.10))
        {
            ilosc_0_10 = Math.floor(liczba / (0.10));
            liczba = liczba % (0.10);
        }
        else if (liczba >= (0.05))
        {
            ilosc_0_05 = Math.floor(liczba / (0.05));
            liczba = liczba % (0.05);
        }
        else if (liczba >= (0.02))
        {
            ilosc_0_02 = Math.floor(liczba / (0.02));
            liczba = liczba % (0.02);
        }
        else if (liczba >= (0.01))
        {
            ilosc_0_01 = Math.floor(liczba / (0.01));
            liczba = liczba % (0.01);
        }
    } while (liczba != 0.00);
    
    System.out.println("5 zł x " + ilosc_5);
    System.out.println("2 zł x " + ilosc_2);
    System.out.println("1 zł x " + ilosc_1);
    System.out.println("0.50 zł x " + ilosc_0_50);
    System.out.println("0.20 zł x " + ilosc_0_20);
    System.out.println("0.10 zł x " + ilosc_0_10);
    System.out.println("0.05 zł x " + ilosc_0_05);
    System.out.println("0.02 zł x " + ilosc_0_02);
    System.out.println("0.01 zł x " + ilosc_0_01);
}

}

3
  1. Te ify to jakaś masakra, jest na to sprytny algorytm: https://pl.m.wikipedia.org/wiki/Problem_wydawania_reszty
  2. Nie rób obliczeń na doublach, skorzystaj z BigDecimal
0

zadebuguj się na pętli i zobacz co robi ;)

dobra, jak używasz double i dzielisz to Twój wynik reszty traci na dokładności i przez to, masz np. 0.009999999999999573, które jest mniejsze niż 0.01, przez to pętla while jest pętlą nieskończoną. Jak napisał kolega wyżej użyj BigDecimal, które nie traci na dokładności.
No i jeszcze ify można zamienić na switcha, który jest bardziej czytelny.
.

1 użytkowników online, w tym zalogowanych: 0, gości: 1