2017-03-04 2 views
0

Ich habe daran gearbeitet, ein Programm zu erstellen, um Änderungen zu berechnen, und das Programm wird nie beendet und beendet nach Abschluss. Ich weiß nicht, was mit meinem Code nicht stimmt. Wenn jemand helfen könnte, wäre das großartig.Berechnen von Änderungen in einem Programm - Gleitkommafehler

private static void calculateChange(double price, double given) { 
    int ones = 0, quarters = 0, dimes = 0, nickels = 0, pennies = 0; 
    double change = given - price; 
    while (change != 0) { 
     if (change >= 1) { 
      change = change - 1; 
      ones++; 
     } 
     if (change >= .25) { 
      change = change - 0.25; 
      quarters++; 
     } 
     if (change >= .10) { 
      change = change - .10; 
      dimes++; 
     } 
     if (change >= .05) { 
      change = change - .05; 
      nickels++; 
     } 
     if (change >= .01) { 
      change = change - .01; 
      pennies++; 
     } 
    } 
    System.out.println(); 
    System.out.println("Correct Change"); 
    System.out.println("Ones " + ones); 
    System.out.println("Quarters " + quarters); 
    System.out.println("Dimes " + dimes); 
    System.out.println("Nickels " + nickels); 
    System.out.println("Pennies " + pennies); 

} 
+0

Sie Gleitkommawerte nicht für ein Programm wie folgt verwenden. Verwenden Sie stattdessen Ganzzahlen (Pennies). – PaulMcKenzie

+0

@PaulMcKenzie Ich habe die Münzen als Ganzzahlen gemacht, aber es funktioniert nicht. – Asker123

+0

Haben Sie es debuggen? Änderung wird wahrscheinlich weniger als 0, die Sie zulassen. – Carcigenicate

Antwort

3

Der double Typ ist floating point und Gleitkommazahlen Handel Präzision für die Leistung. An einem Punkt, wenn Sie Cent von change subtrahieren, wird es weniger als 0,01, aber größer als Null, oder es wird weniger als Null.

In jedem dieser Fälle werden alle Ihre if Bedingungen falsch sein, aber die while Bedingung gilt immer noch, was zu einer Endlosschleife führt. Eine schnelle Lösung wäre, Ihren while Zustand von change != 0 zu change >= 0.01 zu ändern.

Eine bessere Lösung wäre die Verwendung eines ganzzahligen Zahlentyps (z. B. int) und die Anzahl der Cents (also ein Dollar wäre 100). Dieser Ansatz hat keine Gleitkommazahlungenauigkeiten.

+0

Verstanden. Dank dafür. Ich stellte auch sicher, dass ich Pfennige addiere, weil die Änderung immer einen Pfennig weniger enthält. – Asker123

2

Zahlen wie 0,1, 0,05 oder 0,01 können nicht genau als binäre Fließkommazahlen dargestellt werden. Daher wird Ihre change wahrscheinlich nie zu Null.

Abgesehen von ganzen Zahlen oder BCD verwenden, können Sie eine Toleranz erlauben, wenn für Null, zum Beispiel

while (Math.abs(change) < 0.000001) { 
    ... 
} 
1

Vielleicht ist dies eine Gleitkomma-Ausgabe zu überprüfen. Ihre doppelte Genauigkeit "Änderung" wird niemals exakt gleich Null sein, daher wird Ihr "während" -Test immer wahr auswerten. Versuchen Sie etwas zu tun, nach dem Vorbild der während (ändern> = epsilon)

auch ... versuchen eine if else-if-Kette mit ...

Verwandte Themen