2016-04-15 3 views
0

Ich möchte ein kleines System, das mir die optimierte Menge an Rechnungen und Münzen für jeden Wert zurückgibt.Holen Sie sich die Menge der Rechnungen und Münzen für jeden Wert

Hier ist mein Code für während:

public static void main(String[] args) throws IOException { 
    BufferedReader br = new BufferedReader(
      new InputStreamReader(System.in)); 
    double amount = Double.parseDouble(br.readLine()); 
    if (amount > 0 && amount < 1000000.00) { 
     // ############################# BILLS ############################ 
     double rest100 = amount/100; 
     double rest50 = amount % 100; 
     double rest20 = rest50 % 50; 
     double rest10 = rest20 % 20; 
     double rest5 = rest10 % 10; 
     double rest2 = rest5 % 5; 

     // ############################ COINS ############################    
     double rest01 = rest2 % 2; 
     double rest050 = rest01 % 1; 
     double rest025 = rest050 % .5; 
     double rest010 = rest025 % 25; 
     double rest005 = rest010 % .1; 
     double rest001 = rest005 % .05; 

     System.out.println("BILLS:\n" 
      + (int) rest100 
      + " bill(s) of 100.00\n" 
      + (int) rest50/50 
      + " bill(s) of 50.00\n" 
      + (int) rest20/20 
      + " bill(s) of 20.00\n" 
      + (int) rest10/10 
      + " bill(s) of 10.00\n" 
      + (int) rest5/5 
      + " bill(s) of 5.00\n" 
      + (int) rest2/2 
      + " bill(s) of 2.00\n" 
      + "COINS:\n" 
      + (int) (rest01/1) 
      + " coin(s) of 1.00\n" 
      + (int) (rest050/.5) 
      + " coin(s) of 0.50\n" 
      + (int) (rest025/.25) 
      + " coin(s) of 0.25\n" 
      + (int) (rest010/.1) 
      + " coin(s) of 0.10\n" 
      + (int) (rest005/.05) 
      + " coin(s) of 0.05\n" 
      + (int) (rest001/.01) 
      + " coin(s) of 0.01"); 
    } 
} 

Nun, es ist fast richtig, werden die Rechnungen arbeiten perfekt, mein Problem mit den Münzen ist.

Hier sind einige Eingänge:

  • 576,73 // Druck richtig
  • 8.45 // Druck falsch
  • 9.45 // Druck falsch, siehe unten:

tatsächlicher Ausgang:

BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
4 coin(s) of 0.10 
0 coin(s) of 0.05 
4 coin(s) of 0.01 

Expec ted Ausgang:

BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
2 coin(s) of 0.10 
0 coin(s) of 0.05 
0 coin(s) of 0.01 

PS: Ich werde alle erwarteten Ergebnisse nicht veröffentlichen, weil es die Frage größer als jetzt lassen, aber wenn Sie brauchen, kann ich einstellen. Danke im Voraus.

+2

I vermuten, dass das Problem bei 0,1 liegt, 0,05 und 0,01, da sie nicht genau als eine Gleitkommazahl dargestellt werden. Erwägen Sie die Verwendung von Ganzzahl für diese Art von Problem, da Integer-Operationen präzise und schnell sind. –

+0

Warum benutzen Sie math.floor (rest100):? Und warum hast du eine 50-Cent-Münze? – kpie

+1

@kpie wirklich für nichts .. ein Fehler, aber es spielt keine Rolle (leider). Die 50-Cent-Münze existiert in meinem Land. – developer033

Antwort

0

Die folgende Codeversion funktioniert nach Ihren Anforderungen. Vermeiden Sie die Verwendung von Doppelmodulen.

CODE:

public static void main(String[] args) throws NumberFormatException, IOException { 
    BufferedReader br = new BufferedReader(
      new InputStreamReader(System.in)); 
    double amount = Double.parseDouble(br.readLine()); 
    amount= Math.round(amount*100);  
    if (amount > 0 && amount < 1000000.00) {    
     // ############################# BILLS ############################ 
     double rest100 = amount/10000; 
     double rest50 = amount % 10000; 
     double rest20 = rest50 % 5000; 
     double rest10 = rest20 % 2000; 
     double rest5 = rest10 % 1000; 
     double rest2 = rest5 % 500; 

     // ############################ COINS ############################    
     double rest01 = rest2 % 200; 
     double rest050 = rest01 % 100; 
     double rest025 = rest050 % 50; 
     double rest010 = rest025 % 25; 
     double rest005 = rest010 % 10; 
     double rest001 = rest005 % 5; 

     System.out.println("BILLS:\n" 
      + (int) Math.floor(rest100) 
      + " bill(s) of 100.00\n" 
      + (int) (rest50/5000) 
      + " bill(s) of 50.00\n" 
      + (int) (rest20/2000) 
      + " bill(s) of 20.00\n" 
      + (int) (rest10/1000) 
      + " bill(s) of 10.00\n" 
      + (int) (rest5/500) 
      + " bill(s) of 5.00\n" 
      + (int) (rest2/200) 
      + " bill(s) of 2.00\n" 
      + "COINS:\n" 
      + (int) (rest01/100) 
      + " coin(s) of 1.00\n" 
      + (int) (rest050/50) 
      + " coin(s) of 0.50\n" 
      + (int) (rest025/25) 
      + " coin(s) of 0.25\n" 
      + (int) (rest010/10) 
      + " coin(s) of 0.10\n" 
      + (int) (rest005/5) 
      + " coin(s) of 0.05\n" 
      + (int) (rest001/1) 
      + " coin(s) of 0.01"); 
    } 

OUTPUT:

9.45 
BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
2 coin(s) of 0.10 
0 coin(s) of 0.05 
0 coin(s) of 0.01 
+0

Es funktioniert nicht. Getestet mit 9.45 und gibt mir andere Ausgaben als erwartet zurück. – developer033

+0

@ developer033 Ich habe das Problem mit Code behoben Bitte versuchen Sie es erneut – alphablue

+0

Danke. Es klappt!! – developer033

1

Multiplizieren Sie einfach mit 100 und führen Sie die Berechnungen in Cent.

+1

I upvoted Ihre Antwort (auch wenn andere den Grund nicht sehen): Ich würde Modulo Arithmetik mit Gleitkommazahlen wegen Rundungsfehler vermeiden. Multiplizieren Sie mit 100 und verwenden Sie Ganzzahlen. –

+0

Thx, ich stimme zu, es ist definitiv die menschlichste Lösung:) – kpie

Verwandte Themen