Supportnet Computer
Planet of Tech

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).

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.

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.

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.

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).

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: