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)(d
    Math.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 Einzeiler

    O'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.


Anmelden zum Antworten