Supportnet / Forum / Anwendungen(Java,C++...)
Java: Zahlen runden auf 5 bzw. 10
Frage
Hallo!
Ich möchte einen double auf zwei Nachkommastellen runden. So weit kein Problem und mit diversen Herangehensweisen möglich (nehme im Moment DecimalFormat).
Nur: Wie kann ich diese Zahl auf ,05 oder ,10 genau runden? Normalerweise wird ja auf ,01 genau gerundet.
Also beispielsweise bei ",05" die Zahl 2,3378911351 auf 2,35 und die Zahl 2,7794561232 auf 2,80.
Oder bei ",10" die Zahl 2,3378911351 auf 2,40 und die Zahl 2,7894561232 auf 2,80.
Die Versuche, die ich dazu unternommen habe, erscheinen mir sehr kompliziert (z.B. switch für das Runden auf ,05 genau). Der Nutzen des ganzen sei mal ein wenig dahingestellt, aber da ja sicher danach gefragt wird: Es handelt sich um Preise, die aus wechselgeld-technischen Gründen ohne kleine 1- bzw. 2-Cent-Stücke, bei der zweiten Variante auch noch ohne 5-Cent-Stücke, auskommen sollen.
Hat mir jemand einen guten Tipp?
Antwort 1 von MacGyver031
Mathematisch:
5Cent: Wert = Runden(20*Ungerundet,0)/20
10Cent: Wert = Runden(10*Ungerundet,1)/10
Da ich nicht weiss wie du rundest, nehme ich an Runden(wert,kommastellen).
5Cent: Wert = Runden(20*Ungerundet,0)/20
10Cent: Wert = Runden(10*Ungerundet,1)/10
Da ich nicht weiss wie du rundest, nehme ich an Runden(wert,kommastellen).
Antwort 2 von MacGyver031
Fehler im 10Cent: Wert = Runden(Ungerundet,1).
Antwort 3 von peter_f
Hallo und danke für die Hilfe.
Ich möchte kaufmännisch runden und zwar bei 5Cent auf die zweite Kommastelle ("1,85" bzw. "1,80") und bei 10Cent auf die erste Kommastelle ("1,9" bzw. "1,8") des Euro-Betrages.
D.h., bei 10cent-genau wird bei <,x5 abgerundet und bei >= ,x5 aufgerundet.
Bei 5cent-genau ist ,x25 und ,x75 ausschlaggebend, d.h. bei <25 runter auf 0, bei >=25 und <75 auf 5, bei >75 auf 0 der nächst höheren Zahl.
Wie sieht das Runden bei Dir weiter aus? Speziell das Abschneiden der Nachkommastellen zur Rundung.
Ich möchte kaufmännisch runden und zwar bei 5Cent auf die zweite Kommastelle ("1,85" bzw. "1,80") und bei 10Cent auf die erste Kommastelle ("1,9" bzw. "1,8") des Euro-Betrages.
D.h., bei 10cent-genau wird bei <,x5 abgerundet und bei >= ,x5 aufgerundet.
Bei 5cent-genau ist ,x25 und ,x75 ausschlaggebend, d.h. bei <25 runter auf 0, bei >=25 und <75 auf 5, bei >75 auf 0 der nächst höheren Zahl.
Wie sieht das Runden bei Dir weiter aus? Speziell das Abschneiden der Nachkommastellen zur Rundung.
Antwort 4 von MacGyver031
Also, vielleicht war ich nicht deutlich. Kannst du mir die Funktion schreiben mit dem du rundest (als in etwa wie: round(value, digits) ??).
Antwort 5 von DerStefan
genau.. setz aml das Script rein. Sowas ist eigentlich kein Problem.. wir machen das :D
Antwort 6 von Rangoo
´n Abend!
Ich denke, es ist genau sein Problem, dass er eben kein Skript hat und eins haben möchte. ;-)
Auf 0,1 runden ist eigentlich ganz einfach:
Auf deinen Wert x 0,05 addieren, alle Nachkommastellen nach der ersten abschneiden.
Runden auf 0,05 ist schwieriger. Ich würde erst auf 0,01 runden, dann nur die zweite Nachkommastelle als Ganzzahl betrachten, die durch 5 teilen, korrekt runden (mit Math.round), mit 5 multiplizieren und wieder als Nachkommastelle anfügen.
Ich denke, es ist genau sein Problem, dass er eben kein Skript hat und eins haben möchte. ;-)
Auf 0,1 runden ist eigentlich ganz einfach:
Auf deinen Wert x 0,05 addieren, alle Nachkommastellen nach der ersten abschneiden.
Runden auf 0,05 ist schwieriger. Ich würde erst auf 0,01 runden, dann nur die zweite Nachkommastelle als Ganzzahl betrachten, die durch 5 teilen, korrekt runden (mit Math.round), mit 5 multiplizieren und wieder als Nachkommastelle anfügen.
Antwort 7 von Rangoo
Ich korrigiere mich mal zum 0,05:
Ich würde erst durch 5 teilen, auf 0,01 runden und mit 5 multiplizieren.
Ich würde erst durch 5 teilen, auf 0,01 runden und mit 5 multiplizieren.
Antwort 8 von C.Weidemann
Es existieren sicher elegantere Lösungen, aber vielleict können einige Leser hier interesante Details finden:
import java.io.*;
import java.lang.*;
import java.text.NumberFormat;
/**
class Kasse testet Abrunden von double.
Eingabe BruttoBetrag, Ausgabe NettoBetrag - abgerundet ,
Format Euro, 10 cent 5 cent
CW 2006
*/
public class Kasse{
double nettoBetrag =0.0;
public Kasse(){
nettoBetrag =0.0;
}
public Kasse (double brutto){
int euro = (int) brutto;
int cent10Anzahl, cent5Anzahl;
cent10Anzahl = (int)( 10 * brutto - 10 * euro) ;
double rest = brutto - euro - 0.10 * cent10Anzahl;
// Test System.out.println("euro " + euro +" cent10Anzahl " + cent10Anzahl + " rest " + rest);
if (rest >0.0749) cent5Anzahl=2;
else if (rest > 0.0249) cent5Anzahl =1;
else cent5Anzahl =0;
nettoBetrag = euro + 0.1 * cent10Anzahl + 0.05 * cent5Anzahl;
}
/**
Ohne Formatierung
*/
public double zeigBetrag(){
return nettoBetrag;
}
/**
Format -- NumberFormat
*/
public String formatprintBetrag(){
//Ref : java.sun.com/j2se/5.0/docs/api/java/io/PrintStream.html
//Ref : java.sun.com/docs/books/tutorial/java/data/numberintro.html
NumberFormat formatter = NumberFormat.getNumberInstance();
//Mindestens und höchstens 2 DezStellen:
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
String currencyOut = formatter.format(nettoBetrag);
System.out.format("Betrag: " + currencyOut);
return currencyOut;
}//met
/**
Format -- NumberFormat speciell currencyFormatter, abhängig von
local country
*/
public String currencyFormatprintBetrag(){
//Ref : java.sun.com/j2se/5.0/docs/api/java/io/PrintStream.html
//Ref : java.sun.com/docs/books/tutorial/java/data/numberintro.html
NumberFormat currencyFormatter;
String currencyOut;
currencyFormatter = NumberFormat.getCurrencyInstance();
currencyOut = currencyFormatter.format(nettoBetrag);
System.out.format("%s%n", currencyOut);
return currencyOut;
}//met
/**
Test Ausgabe
*/
public static void testPrint(double bruttoBetrag){
System.out.println("----- (Brutto Betrag " +bruttoBetrag + ") Anruf in testPrint() ----");
Kasse ihrBetrag = new Kasse (bruttoBetrag);
System.out.println("Default Format zeigBetrag(): ");
System.out.println(ihrBetrag.zeigBetrag() );
System.out.println("Format currencyFormatprintBetrag():");
ihrBetrag.currencyFormatprintBetrag();
System.out.println("Format formatprintBetrag():");
ihrBetrag.formatprintBetrag();
System.out.println(" ");
}
/**
main zum Testen
*/
public static void main(String[] args){
double bruttoBetrag;
bruttoBetrag = 899.92;
Kasse ihrBetrag = new Kasse (bruttoBetrag);
System.out.println("----- (Brutto Betrag " +bruttoBetrag + ") Anruf in main() ----");
System.out.println("zeigBetrag ");
System.out.println(ihrBetrag.zeigBetrag() );
System.out.println("currencyFormatprintBetrag");
ihrBetrag.currencyFormatprintBetrag();
System.out.println("formatprintBetrag");
ihrBetrag.formatprintBetrag();
System.out.println(" ");
bruttoBetrag = 899.92;
testPrint(bruttoBetrag);
bruttoBetrag = 899.93;
testPrint(bruttoBetrag);
bruttoBetrag = 899.96;
testPrint(bruttoBetrag);
System.out.println("end main ");
}//main
}//class
Antwort 9 von peter_f
Danke euch für die Antworten!
Auf 0,1 zu runden, habe ich einfach dadurch hinbekommen, dass ich DecimalFormat() zwei Mal nehme. Etwas unelegant - und ich habe das Gefühl langsam - da ein String wieder in einen Double geparst wird und dann wieder zu einem String, aber funktioniert.
Auf 0,05 runden klappt nun dank
"Ich würde erst durch 5 teilen, auf 0,01 runden und mit 5 multiplizieren. "
auch problemlos! Wunderbar. Den Code hab ich jetzt gar nicht mehr gebraucht, aber es ist gut, ihn für den Fall der Fälle zu haben (und mit der Suche wird er sicherlich auch anderen mal helfen).
Auf 0,1 zu runden, habe ich einfach dadurch hinbekommen, dass ich DecimalFormat() zwei Mal nehme. Etwas unelegant - und ich habe das Gefühl langsam - da ein String wieder in einen Double geparst wird und dann wieder zu einem String, aber funktioniert.
Auf 0,05 runden klappt nun dank
"Ich würde erst durch 5 teilen, auf 0,01 runden und mit 5 multiplizieren. "
auch problemlos! Wunderbar. Den Code hab ich jetzt gar nicht mehr gebraucht, aber es ist gut, ihn für den Fall der Fälle zu haben (und mit der Suche wird er sicherlich auch anderen mal helfen).

