Double / Floats runden
-
Hallo!
Gibt es irgendwo im JDK1.4 eine Methode, die Double / Floats auf eine beliebige Genauigkeit rundet?
Beispiel:
round(new Float(4.33333333), 3); gibt 4.333 zurück.
round(new Double(0.45544), 2); gibt 0.46 zurück.Danke & Gruss
Carsten
-
Dazu muss man ein wenig selbst Hand anlegen, wie im folgenden Beispiel:
[java]import java.lang.Math;
public class Rounding
{
public static String toString (double d, int place)
{
if (place <= 0)
return ""+(int)(d+((d > 0)? 0.5 : -0.5));
String s = "";
if (d < 0)
{
s += "-";
d = -d;
}
d += 0.5Math.pow(10,-place);
if (d > 1)
{
int i = (int)d;
s += i;
d -= i;
}
else
s += "0";
if (d > 0)
{
d += 1.0;
String f = ""+(int)(dMath.pow(10,place));
s += "."+f.substring(1);
}
return s;
}[/code]
Als Beispiel für die Verwendung:[java]double d = 124.06729562978229;
System.out.println(" intended 124.06729562978229");
System.out.println(" internal "+d);
System.out.println();
System.out.println("rounded to 0 "+Rounding.toString(d,0));
System.out.println("rounded to 1 "+Rounding.toString(d,1));
System.out.println("rounded to 2 "+Rounding.toString(d,2));
System.out.println("rounded to 3 "+Rounding.toString(d,3));
System.out.println("rounded to 4 "+Rounding.toString(d,4));
System.out.println("rounded to 5 "+Rounding.toString(d,5));
System.out.println("rounded to 6 "+Rounding.toString(d,6));
System.out.println("rounded to 7 "+Rounding.toString(d,7));
System.out.println("rounded to 8 "+Rounding.toString(d,8));
System.out.println("rounded to 9 "+Rounding.toString(d,9));[/code]gibt dann das Ergebnis:
rounded to 0 124 rounded to 1 124.1 rounded to 2 124.07 rounded to 3 124.067 rounded to 4 124.0673 rounded to 5 124.06730 rounded to 6 124.067296 rounded to 7 124.0672956 rounded to 8 124.06729563 rounded to 9 124.067295630
Hope that helps
-
Hallo Czengis!
Danke erstmal für die Antwort.
Leider funktioniert die Methode nicht für die Exponentialdarstellung, z. B. 1.34343E-8.
Weisst Du auch hier einen Rat?
Gruss
Carsten
[ Dieser Beitrag wurde am 14.05.2002 um 09:14 Uhr von cm editiert. ]
-
Du kannst die Zahl wohl so angeben aber ob das Sinn macht ist fraglich.
-
Hallo Czengis!
Bei unserer Anwendung macht dies Sinn. Ich habe die Methode eben so umgeschrieben, dass sie auch Zahlen in Exponential-Darstellung schluckt. Dazu wird, wenn ein 'E' gefunden wird einfach dieser Teil abgeschnitten, die Methode dann rekursiv ohne die Exponential-Darstellung aufgerufen und dann der gerundete Wert wieder mit dem Exponenten zurückgegeben. Hier der Code:
public static String toString (double d, int place) { String s= new Double(d).toString(); int e = s.indexOf("E"); if(e != -1) { String exp = s.substring(e, s.length()); s=s.substring(0,e); return toString(new Double(s).doubleValue(), place)+exp; } else { if (place <= 0) return ""+(int)(d+((d > 0)? 0.5 : -0.5)); s = ""; if (d < 0) { s += "-"; d = -d; } d += 0.5*Math.pow(10,-place); if (d > 1) { int i = (int)d; s += i; d -= i; } else s += "0"; if (d > 0) { d += 1.0; String f = ""+(int)(d*Math.pow(10,place)); s += "."+f.substring(1); } return s; } }
Gruss
Carsten
-
Gut, wenns klappt Ihr solltet aber noch darauf achten, dass es keinen Überlauf gibt - bei mir ist aber der 7 Stelle die Zahl total "f#cked up". Das hängt wohl mit der Tatsache zusammen, dass diese Zahl nicht durch 'nen echten Bruch darstellbar ist.
-
Ui, ui
setze 'nen Vierzeiler dagegen:
[java]
public String round(double number, int precision)
{
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(precision);
nf.setMaximumFractionDigits(precision);
return nf.format(number);
}[/code]bis dänn, O'Dog
-
Pah, was der O'Dog kann, kann ich schon lange.
Hier kommt mein Zweizeiler:
public String round(double number, int precision) { BigDecimal bd = new BigDecimal(number); return ("" + bd.setScale(precision, BigDecimal.ROUND_HALF_UP)); }
-
doppelt LOL
jap, dann geht der Punkt wohl an dich,
es sei denn jetzt kommt noch jemand mit'nem EinzeilerO'Dog
-
[java]
public String round(double number, int precision)
{
return ("" + new BigDecimal(number).setScale(precision, BigDecimal.ROUND_HALF_UP));
}[/code]Na gut, der ist unfair, war ja schließlich deine Idee.
O'Dog
-
Heyyyy das könnten wir öfter machen Ich denke da kann man viel lernen
-
Hallo!
Vielen Dank für eure Beiträge. Ich habe mich für O'Dogs 1. Version entschieden und diese erweitert, so dass Zahlen in Exponentialdarstellung richtig verarbeitet werden.
Gruss
Carsten
-
Ich verschiebe diesen Thread in die FAQ.