| Autor |
Nachricht |
cm
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.07.2000
Beiträge: 207
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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]
Na gut, der ist unfair, war ja schließlich deine Idee.
O'Dog |
_________________ Ich war Atheist, bis ich erkannte, dass ich Gott bin.
|
|
 |
CengizS
Moderator
Benutzerprofil
Anmeldungsdatum: 28.05.2001
Beiträge: 3502
|
CengizS Moderator
22:42:00 14.05.2002 Titel: |
|
Zitieren |
Heyyyy das könnten wir öfter machen Ich denke da kann man viel lernen |
_________________ Viele Grüße, Cengiz Şahin
|
|
 |
cm
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.07.2000
Beiträge: 207
|
cm Mitglied
10:12:00 15.05.2002 Titel: |
|
Zitieren |
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 |
|
|
|
 |
CengizS
Moderator
Benutzerprofil
Anmeldungsdatum: 28.05.2001
Beiträge: 3502
|
CengizS Moderator
10:20:00 15.05.2002 Titel: |
|
Zitieren |
Ich verschiebe diesen Thread in die FAQ. |
_________________ Viele Grüße, Cengiz Şahin
|
|
 |