# Nachkommastellen abschneiden



## Plauzi92 (30. Okt 2019)

Hallo Community,

ich soll von einem double Wert eine bestimmte Anzahl von Nachkommastellen streichen sodass nur so viele Nachkommstellen über bleiben die von einem Integer Wert vorgegeben werden.

Beispiel double x = 3,123456, int y = 4  -> Ausgabe : 3,1234

Das funktioniert mit meinem Code soweit auch ganz gut. Wenn ich in die Methode allerdings folgende Werte übergebe: double x = 3.12453252452135, int = 9 spuckt er mir als Ergebnis 2.147483647 aus. Kann es etwas mit dem Wertebereich des doubles zu tun haben? Wenn ja, wie löse ich das dann? Die Werte sind vom Prof als Testfälle vorgegeben und bis auf diese beiden klappen auch alle anderen.

Hier mein Code: 

```
public static double abschneiden(double x, int y) {
        
        
        if (y<0 || y>10)        // Falls y kleiner 0 oder groesser 10 soll Startwert zurueck gegeben werden
            return x;
        
        if (y==0)                 // Sonderfall fuer y = 0
        {
            int u = (int) x;
            x = (double) u;
            return x;
        }
            
            else {
        double z =10;
        
        for (int i =1; i<y; i++) {    // Komma um y Stellen nach rechts verschieben, umwandeln in integer um nachkommastellen zu streichen
                                    // Komma um y Stellen nach links verschieben und x zurueck geben.
            z= z*10;
        }
        
        x = z*x;
        int u = (int) x;
        x = (double) u;
        x=x/z;
        return x;
    }
    }
```

Würde mich riesig über einen Tipp freuen,
Danke im Voraus


----------



## Robat (30. Okt 2019)

Darfst du mit Strings arbeiten? Dann könnte man auch ganz einfach `String#format` und `Double#valueOf` nutzen


----------



## CyborgBeta123 (30. Okt 2019)

Plauzi92 hat gesagt.:


> Das funktioniert mit meinem Code soweit auch ganz gut. Wenn ich in die Methode allerdings folgende Werte übergebe: double x = 3.12453252452135, int = 9 spuckt er mir als Ergebnis 2.147483647 aus. Kann es etwas mit dem Wertebereich des doubles zu tun haben?


Ja hat es der Wertebereich von long/int ist kleiner als der von double.


----------



## Plauzi92 (30. Okt 2019)

@Robat danke für die schnelle Antwort. Ob wir das nutzen dürfen weiß ich nicht. In der Vorlesung wurde bisher nur Casting von Integers und Doubles behandelt also denke ich mal, dass wir es damit lösen sollen. 

@CyborgBeta123 auch dir danke für die Antwort. Ich benutze Integer ja nicht in meiner Rechnung sondern double. Das heißt ich müsste das irgendwie so umschreiben, dass ich mit einem double den Zwischenschritt mit der Verschiebung des Kommas hinbekomme ohne aus dem Wertebereich zu fallen.


----------



## CyborgBeta123 (30. Okt 2019)

Du suchst vermutlich das:

```
DecimalFormat f = new DecimalFormat();
f.setMaximumFractionDigits(9);
System.out.println(f.format(3.12453252452135));
```




Plauzi92 hat gesagt.:


> Ich benutze Integer ja nicht in meiner Rechnung sondern double


Natürlich benutzt du eine Ganzzahl, anders würde es auch nicht hinhauen.


----------



## Plauzi92 (30. Okt 2019)

@CyborgBeta123 hatte gerade einen Denkfehler. Du hast Recht  
Die Lösung hatte ich auch schon im Netz gefunden und die funktioniert auch in der Theorie. Allerdings ist die Funktion nicht erlaubt. Würde auch der Übung den Sinn nehmen.

Das hier ist die Aufgabenstellung: 
"Implementieren Sie eine statische-public-Methode mit dem Namen "abschneiden",
welche einen Double-Wert und einen Integer-Wert erhält und einen Double-Wert zurückgibt.
Der eingegebene Double-Wert soll nach der Kommastelle, gemäß des eingegebenen Integer-Wertes, abgeschnitten werden.
Sollte der eingegebene Integer-Wert kleiner als 0 oder größer als 10 sein, dann wird der eingegebene Double-Wert unverändert zurückgegeben.
Verwenden Sie dafür passende Kontrollstrukturen, Operatoren und Typumwandlungen um ihr Ziel zu erreichen.
Bsp: abschneiden(5.216497893, 4) liefert das Ergebnis 5.2164 "


----------



## Plauzi92 (30. Okt 2019)

Ahhhh ich habs..  @CyborgBeta123 du hast es gesagt, ich hab´s gemerkt und dann nicht geändert..   Manchmal sieht man den Wald vor lauter Bäumen nicht. Wenn ich mit long rechne passt es. 
Danke für die Hilfe Leute


----------



## CyborgBeta123 (30. Okt 2019)

Ich vermute dennoch, die Aufgabestellung zielt hierauf ab:

```
double d = 3.12453252452135;
double d2 = (int) d;
double d3 = 10;
for (int i = 0; i < 9; i++) {
	d  -= (int) d;
	d  *= 10;
	d2 += ((int) d) / d3;
	d3 *= 10;
}
System.out.println(d2);
```




Plauzi92 hat gesagt.:


> Wenn ich mit long rechne passt es


Nein, auch long ist manchmal für double zu klein...


----------

