2012-04-13 16 views
1

Hallo Ich habe ein Problem beim Erstellen eines Änderungsrechners für eine Schulaufgabe. Es ist im Wesentlichen zu berechnen, die geringste Menge an Änderungen für eine bestimmte Menge an Geld benötigt.Rundungsfehler?

  • Ex. $ 5.36:
  • 2 Toonies (2 $)
  • 1 Loonie (1 $)
  • 1 Quartal
  • 1 Cent
  • 0 Nickels
  • 1 Cent

ich gesagt habe Alle meine Variablen müssen verdoppelt werden, damit ich die Werte und Summen zusammen berechnen kann. Es scheint auf ganze Zahlen (5.00, 6.00, 7.00) gut zu funktionieren, aber versagt, wenn ich eine Dezimalstelle hinzufüge. Wie wenn ich sage $ 5,25 sollte es 2 Toonies 1 Loonie und 1 Viertel sagen. Ich denke, es könnte ein Fehler beim Runden oder etwas falsch bei meinen Berechnungen sein. Jede Hilfe wird geschätzt. Hier sind die Berechnungen des Codes:

//Rounding to one number   
DecimalFormat oneDigit = new DecimalFormat ("#,0"); 

//Ask user for input 
String moneyinput = JOptionPane.showInputDialog ("Welcome to the Change Caluculator. " 
       + "Please Enter your amount of money in Dollars ($): "); 

//Take user input and create into string. 
totmoney = Double.parseDouble (moneyinput); 

//Calculate number of toonies 
numtoonies = (totmoney/toonieval); 

System.out.println ("There is a total of " + oneDigit.format (numtoonies) + " toonies."); 

//Find new amount 
totmoney = (totmoney%toonieval); 

//Calculate the number of loonies 
numloonies = (totmoney/loonieval); 

//Find new amount 
totmoney = (totmoney-numloonies); 

System.out.println ("There is a total of " + oneDigit.format (numloonies) + " loonies."); 

//Calculate number of quarters 
numquarters = (totmoney/quarterval); 

//State the about of Coins 
System.out.println ("There is a total of " + oneDigit.format (numquarters) + " quarters."); 
} 
+0

Ich wurde angewiesen, Decimalformat zu verwenden, so dass, wenn ich das tun Berechnungen bekomme ich nur eine ganze Zahl in der Ausgabe statt dezimal. Ich denke, ich mache alles richtig in den Berechnungen, aber ich bekomme eine seltsame Antwort, wenn es nicht eine ganze Zahl ist. – Dave555

Antwort

3

Ich verstehe nicht ganz, warum Sie das DecimalFormat überhaupt verwenden. Sie sollten in der Lage sein, dies nur mit Mod % und Division / zu lösen.

Dies ist, wie ich dieses Problem Ansatz würde:

  1. Nehmen Sie die Eingaben vom Benutzer (als Doppel im Format 5,33)
  2. speichern, die als int durch die Dezimalstelle (int value bewegen = Kosten * 100)
  3. Findet die Anzahl von Toonies durch Teilung unter Verwendung von (numToonies = value/toonieval)
  4. Finden der Restgeldbetrag von (value = Wert% toonieval)
  5. die Schritte 3 und 4 für die anderen Höhle ominations

Hinweis: Sie werden die Werte der Toonies ändern müssen, um die Tatsache widerzuspiegeln, dass der Preis, den Sie mit 100.

+0

@sarnold Ich habe den falschen Variablennamen verwendet, ich habe sie behoben. – twain249

+0

Okay, ich denke du hast es jetzt richtig. Vielen Dank! – sarnold

1

multipliziert wurde verwendet, ich glaube nicht, das funktioniert richtig für Gleitkommazahlen :

totmoney = (totmoney%toonieval); 

Versuchen

totmoney = totmoney - toonieval*numtoonies; 

statt.

Beachten Sie auch, dass Fließkommawerte generell nicht zur Verarbeitung von monetären Werten geeignet sind (wegen der Möglichkeit von Rundungsfehlern). Verwenden Sie stattdessen Festkommazahlen (speichern Sie den Wert im Grunde in Cents und berechnen Sie alles auf einer Cents-Basis).

+0

Was würde das tun, wenn "totmoney" zehn oder hundert mal größer ist als "toonyval"? – sarnold

+0

@sarnold - Nicht sicher, dass ich Ihre Frage verstehe. Wenn Sie nach meinem Vorschlag nach "Versuchen" fragen: basierend auf der Erklärung des OP ist der Wert einer Toonie $ 2, also ist 'toonyval * 2 'der Dollarwert der Anzahl der Toones - im Wesentlichen das Gleiche wie der Modul, aber lässt den Bruchteil unberührt. – Attila

+0

@Attila Ich denke, das Problem, das er anzog, ist Toonyval = 2 und Numtoonies ist die Anzahl der verwendeten Toonies. Zumindest ist es das, wenn ich es richtig lese. – twain249

1

Verwenden Sie keine Gleitkommazahlen, wenn Sie absolute Genauigkeit benötigen. Die IEEE-Gleitkommaspezifikation, der java folgt, gibt sogar an, dass es zu einem Genauigkeitsverlust kommen wird, da die Gleitkommaspezifikation nicht alle Gleitkommaoperationen korrekt darstellen kann, sondern sie nur annähern kann.Die Lösung dafür ist, dass Sie den Wert in 2 Zoll, eine für den Rest der Dezimalstelle und eine für den Wert rechts von der Dezimalstelle speichern müssen

Verwandte Themen