# Runden auf eine Nachkommastelle



## Pluta (21. Okt 2007)

WIe schaffe ich es eine Integerzahl auf EINE Nachkommestalle abzurunden, wobei die Anzahl der NAchkommastellen desöfteren variiert


----------



## JPKI (21. Okt 2007)

Ein Integer? Auf eine Nachkommastelle runden??
Integer = Ganzzahl!


----------



## Pluta (21. Okt 2007)

Sorry meinte float oder double


----------



## JPKI (21. Okt 2007)

```
float f = 12345.6789f;
String s = String.valueOf(f);
float rounded = Double.parseDouble(s.substring(0,s.lastIndexOf('.')+1));
```


----------



## Pluta (21. Okt 2007)

er sagt dazu das er nicht von double zu float konvertieren kann


----------



## JPKI (21. Okt 2007)

Upps, was für ein peinlicher Fehler :wink: 
Bitte sehr:

```
float f = 12345.6789f;
String s = String.valueOf(f);
float rounded = Float.parseFloat(s.substring(0,s.lastIndexOf('.')+1));
```


----------



## Pluta (21. Okt 2007)

Scheint ja einigermassen zu funktionieren. jedoch steht nach dem Komma immer eine 0. Müßte ja die letzte Zahl schon gerundet dort stehen haben


----------



## Pluta (21. Okt 2007)

public class Hauptprogramm {

	public static void main(String[] args)
	{int monat = 4, jahr = 1919, ErgebnisF = 1, ErgebnisQS = 0, Ergebnis1, zaehler, zaehler2 = 0, Anzahla = 0, Anzahle = 0;
	float groesse = 1.81f, Ergebnis2 = 0, rounded = 0, Ergebnis3 = 0; double result = 0;
	String Name = "Dieter Zuschulte";
	boolean weiblich;
	char buchstabe;
	weiblich = false;



	{for (zaehler = 1; zaehler <= monat; zaehler++) ErgebnisF = ErgebnisF * zaehler;}


	{
		while (jahr > 0)
		{ErgebnisQS += jahr % 10;
	jahr /= 10;}}



	{Ergebnis1 = ErgebnisF + ErgebnisQS;} 



	{Ergebnis2 = Ergebnis1 * groesse;}



	int laenge = Name.length() - 1;
    do {buchstabe = Name.charAt(zaehler2); if (buchstabe == 'a') Anzahla = Anzahla + 1; 
	else if (buchstabe == 'e' ) Anzahle = Anzahle + 1;}
	while (zaehler2++ < laenge);
    if (Anzahla < 1) Anzahla = 1;
    if (Anzahle < 1) Anzahle = 1;







    if (weiblich == true) Ergebnis3 = Ergebnis2 / Anzahla; 
    if (weiblich == false) Ergebnis3 = Ergebnis2 / Anzahle;


   float f = Ergebnis3;
   String s = String.valueOf(f);
   rounded = Float.parseFloat(s.substring(0,s.lastIndexOf('.')+1));

System.out.print (rounded);


----------



## Pluta (21. Okt 2007)

ERgänzung : SOll eigentlich nur nach der ersten NAchkommastelle abschneiden


----------



## JPKI (21. Okt 2007)

Kleiner Indexfehler in meinem obigen Code, folgendes funktioniert jetzt aber:

```
float f = Float.parseFloat(args[0]);
String s = String.valueOf(f);
float rounded = Float.parseFloat(s.substring(0,s.lastIndexOf('.')+2));
```


----------



## Pluta (21. Okt 2007)

Hey dank dir, klappt echt gut

Nur muß ich das ja auch selber verstehen, kannst du vielleicht ein wenig erläutern wie du das genau gemacht hast. Verstehe nur die letzte Zeile nicht so ganz


----------



## JPKI (21. Okt 2007)

Also, innerhalb der Klammern der parseFloat()-Funktion werden der als String vorhandenen Fließkommazahl alle Zeichen ab der zweiten Stelle nach dem letzten Punkt abgeschnitten. Durch die parseFloat()-Funktion wird das ganze dann noch in ein Float umgewandelt.


----------



## Gelöschtes Mitglied 5909 (21. Okt 2007)

eigentlich rundet man nicht, sondern stellt es nur da mit den formatern.

ansonsten wäre sowas am einfachsten (auch wenn des eigentlich nicht der sinn von den Formattern ist)


```
public static double round(double value, int pos) {
	NumberFormat format = NumberFormat.getInstance(Locale.US);
	format.setMaximumFractionDigits(pos);
	format.setMinimumFractionDigits(pos);
	return Double.parseDouble(format.format(value));
    }
```

man möge mir verzeihen 

p.s.: die tabs sind bei mir irgendwie am arsch


----------



## Marco13 (21. Okt 2007)

JPKI hat gesagt.:
			
		

> Upps, was für ein peinlicher Fehler :wink:
> Bitte sehr:
> 
> ```
> ...



Peinlicher als die Lösung an sich kann der Fehler kaum sein. (Würdest du dich diskreditiert fühlen, wenn ich das als "Bockmist" bezeichnen würde?)

float f = 12345.6789f;
float g = Math.round(f*10)/10.0f;


----------



## JPKI (22. Okt 2007)

Marco13 hat gesagt.:
			
		

> Würdest du dich diskreditiert fühlen, wenn ich das als "Bockmist" bezeichnen würde?


Keine Sorge, ich bin's gewöhnt, dass sich andere über meinen Programmierstil "wundern" :wink:
Aber hey, mein Code funktioniert doch. Der Threadersteller wollte doch nur wissen, wie man alle Stellen nach der letzen abtrennt. 





			
				Pluta hat gesagt.:
			
		

> ERgänzung : SOll eigentlich nur nach der ersten NAchkommastelle abschneiden


----------



## Marco13 (22. Okt 2007)

Hmja :?  schau' dir mal in der src.zip in deinem JDK-Verzeichnis die Klasse "FloatingDecimal" an, die für die Hin- und Her-Umwandlung von String<->Float verantwortlich ist. Danach wirst du String.valueOf(float) und Float.parseFloat(String) mir größerer Vorsicht gebrauchen. (In dieser Klasse taucht in den Kommentaren insgesamt 10 (*zehn*) mal das Wort "Hack" auf ... und so sieht sie auch aus  :? )


----------



## JPKI (22. Okt 2007)

Hehe, schön wär's! In der Datei Float.java aus dem java.lang-Paket wird die Klasse sun.misc.FloatingDecimal importiert und diese ist nicht in der src.zip enthalten.


----------



## Gast (25. Okt 2007)

Er wollte aber, dass nach der 2. Stelle abgeschnitten und nicht gerundet wird.


----------



## Marco13 (25. Okt 2007)

Pluta hat gesagt.:
			
		

> WIe schaffe ich es eine Integerzahl auf EINE Nachkommestalle abzurunden, wobei die Anzahl der NAchkommastellen desöfteren variiert





			
				Gast hat gesagt.:
			
		

> Er wollte aber, dass nach der 2. Stelle abgeschnitten und nicht gerundet wird.



Naja. "EINE" und "zwei" sind schone in Unterschied. Aber er hat tatsächlich nicht von "runden" sondern von "*ab*runden" geredet, demnach wäre es

float f = 12345.6789f;
float g = Math.*floor*(f*10)/10.0f; // statt round


----------

