Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - Java ::  Double / Floats runden  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
cm
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.07.2000
Beiträge: 207
Beitrag cm Mitglied 08:24:00 14.05.2002   Titel:   Double / Floats runden            Zitieren

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
Werbeunterbrechung
CengizS
Moderator

Benutzerprofil
Anmeldungsdatum: 28.05.2001
Beiträge: 3502
Beitrag CengizS Moderator 08:45:00 14.05.2002   Titel:              Zitieren

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.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;
}[/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:

Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
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
Code:
1
2
3
4
5
6
7
8
9
10
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
Code:
1
2
3
4
5
6
7
8
9
10
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

_________________
Viele Grüße, Cengiz Şahin
cm
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.07.2000
Beiträge: 207
Beitrag cm Mitglied 08:54:00 14.05.2002   Titel:              Zitieren

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. ]
CengizS
Moderator

Benutzerprofil
Anmeldungsdatum: 28.05.2001
Beiträge: 3502
Beitrag CengizS Moderator 09:23:00 14.05.2002   Titel:              Zitieren

Du kannst die Zahl wohl so angeben aber ob das Sinn macht ist fraglich.

_________________
Viele Grüße, Cengiz Şahin
cm
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.07.2000
Beiträge: 207
Beitrag cm Mitglied 10:07:00 14.05.2002   Titel:              Zitieren

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:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    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;
        }
    }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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;
}
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    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
CengizS
Moderator

Benutzerprofil
Anmeldungsdatum: 28.05.2001
Beiträge: 3502
Beitrag CengizS Moderator 10:57:00 14.05.2002   Titel:              Zitieren

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.

_________________
Viele Grüße, Cengiz Şahin
O'Dog
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.05.2000
Beiträge: 1198
Beitrag O'Dog Mitglied 18:49:00 14.05.2002   Titel:              Zitieren

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

_________________
Ich war Atheist, bis ich erkannte, dass ich Gott bin.
Twiggy Ramirez
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2002
Beiträge: 101
Beitrag Twiggy Ramirez Mitglied 20:22:00 14.05.2002   Titel:              Zitieren

Pah, was der O'Dog kann, kann ich schon lange. ;)

Hier kommt mein Zweizeiler:

C/C++ Code:
public String round(double number, int precision) {
BigDecimal bd = new BigDecimal(number);
return ("" + bd.setScale(precision, BigDecimal.ROUND_HALF_UP));
}
C/C++ Code:
public String round(double number, int precision) {
BigDecimal bd = new BigDecimal(number);
return ("" + bd.setScale(precision, BigDecimal.ROUND_HALF_UP));
}
C/C++ Code:
public String round(double number, int precision) {
BigDecimal bd = new BigDecimal(number);
return ("" + bd.setScale(precision, BigDecimal.ROUND_HALF_UP));
}

_________________
C++? Is that a kind of toilet paper?
O'Dog
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.05.2000
Beiträge: 1198
Beitrag O'Dog Mitglied 20:33:00 14.05.2002   Titel:              Zitieren

doppelt LOL

jap, dann geht der Punkt wohl an dich,
es sei denn jetzt kommt noch jemand mit'nem Einzeiler

O'Dog

_________________
Ich war Atheist, bis ich erkannte, dass ich Gott bin.
O'Dog
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.05.2000
Beiträge: 1198
Beitrag O'Dog Mitglied 20:38:00 14.05.2002   Titel:              Zitieren

[java]
public String round(double number, int precision)
{
return ("" + new BigDecimal(number).setScale(precision, BigDecimal.ROUND_HALF_UP));
}[/code]

:D

Na gut, der ist unfair, war ja schließlich deine Idee.

O'Dog

_________________
Ich war Atheist, bis ich erkannte, dass ich Gott bin.
C/C++ Forum :: FAQ - Java ::  Double / Floats runden  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.