# Einmal Runden ohne alles



## DerIch (19. Dez 2005)

Moin, ich soll ein Programm zum Runden von Zahlen schreiben, darf aber math.round oder BigDecimal nicht verwenden.
Hab also selbst eins gemacht, dass nicht so ganz funktioniert. Was mache ich falsch?

```
public class Round2 {
  
  static double runde(double x, int stellen){

    x = x*Math.pow(10,stellen);
    String zahl = Double.toString(x);

    double wert;
    int rundungszahl = zahl.charAt(stellen);
    int pos = zahl.charAt(stellen+1);
      if (pos < 5)
        wert =  rundungszahl/Math.pow(10,stellen);
      else
        wert = (rundungszahl+1)/Math.pow(10,stellen);
      return wert;



  }
  public static void main(String[] args) {
    double x;
    int stellen;
      x = Double.parseDouble(LIES.liesWort("Geben Sie die zu rundende Zahl ein:"));  
      stellen = LIES.liesInt("Auf wieviele Stellen soll gerundet werden? ");           
      double zahl = runde(x,stellen);                                      
      System.out.println("--->"  + zahl  );
  }
    
}
```


----------



## SlaterB (19. Dez 2005)

> Hab also selbst eins gemacht, dass nicht so ganz funktioniert.

günstig wären falsche Beispiele oder Fehlermeldungen

-----------------

int rundungszahl = zahl.charAt(stellen); 
int pos = zahl.charAt(stellen+1); 

charAt liefert nur ein Zeichen aus dem String, also maximal eine Ziffer, in deiner Verwendung aber nur 
den Zeichencode dieser Ziffer (z.B. ist der Zeichencode von '0' = 48 ),
auf keinen Fall kommst du so an die gesamte Zahl von Anfang an bis zur gesuchten Stelle

versuch mal was mit den Operationen String.substring() und Integer.parseInt(),

-------------

bedenke auch dass Zahlen < 0 ein führendes Minus-Zeichen haben

-------------

solange du noch am Programm selber arbeitest nimm doch diese nervigen Benutzereingaben raus,
die tragen doch recht wenig zum Problem bei

mit

```
public static void main(String[] args) {
    double x;
    int stellen;
      x = 50.86;
      stellen = 1;
      double zahl = runde(x,stellen);                                     
      System.out.println("--->"  + zahl  );
  }
```
läßt sich schneller testen als mit 


```
public static void main(String[] args) {
    double x;
    int stellen;
      x = Double.parseDouble(LIES.liesWort("Geben Sie die zu rundende Zahl ein:")); 
      stellen = LIES.liesInt("Auf wieviele Stellen soll gerundet werden? ");           
      double zahl = runde(x,stellen);                                     
      System.out.println("--->"  + zahl  );
  }
```


----------



## DerIch (19. Dez 2005)

Ok, hab es jetzt mal so geändert:

```
public class Round2 {
  
  static double runde(double x, int stellen){

    x = x*Math.pow(10,stellen);
    String zahl = Double.toString(x);

    double wert;

    int pos = zahl.charAt(stellen+1);
    String rundungszahl = ;
      if (pos < 5)
        wert =  (Double.parseDouble(rundungszahl))/Math.pow(10,stellen);
      else
        wert = (Double.parseDouble(rundungszahl+1))/Math.pow(10,stellen);
      return wert;
```

Jetzt fehlt mir nur noch was für die rundungszahl. Wie kann ich die erhöhen, wenn ich aufrunden will?


----------



## messi (19. Dez 2005)

```
public static double runde(double x, int stellen) {
    double magn = Math.pow(10, stellen); //Oder hier Schleife 0..stellen: magn *= 10.0
    x *= magn;
    x = (double) (long) (x + 0.5);
    x /= magn;
    return x;
}
```


----------



## SlaterB (19. Dez 2005)

messis Lösung ist natürlich schöner sodass sich die String-Geschichte bis auf Übungszwecke eigentlich erledigt,
aber was meinst du mit 
> Ok, hab es jetzt mal so geändert

da ist doch noch überhaupt nix hin zur richtigen Lösung geändert außer das du eine Zeile gelöscht hast 

und die Frage 
> Jetzt fehlt mir nur noch was für die rundungszahl. Wie kann ich die erhöhen, wenn ich aufrunden will?
wirkt auch deplaziert,
das Auf- und Abrunden ist so ziemlich das einzig funktionierend aussehende darin 
(aber Vorsicht bei negativen Zahlen)


----------



## SnooP (20. Dez 2005)

1. Frag doch mal deinen Hiwi 

2. Benutze keinen String - das klingt erst einfach - ist aber nicht unbedingt der Fall...

3. Überlege dir mathematische Operationen mit denen du an die letzte Stelle einer Zahl kommst.
Das Math.pow sieht ja schon ganz gut aus, um aus einer 1,2345 Zahl sowas wie 12345,... zu machen - ich würde das allerdings nicht in der Variablen x speichern, sondern in einer internen - z.B. "zahl" vom Typ long (entsprechend double). Weil du für deine interne Berechnung lediglich ganze Zahlen brauchst: long zahl = (long) Math.pow...

4. Stichwort mathematische Operationen: Wie kann man bei einer Dezimalzahl das Komma nach links verschieben? Sagt dir Modulo was?  ... zur Not hilft auch Rechnen mit einem Taschenrechner um das mal auszuprobieren - der Windows-Taschenrechner oder aber unter Linux z.B. "kcalc" sind dir dabei sicherlich behilflich.

5. Denke an die Fallunterscheidung für negative Zahlen... du musst sowohl bei 5 aufrunden, als auch bei -5 abrunden...

6. Stichwort Messis Lösung: sieht sehr gut aus... funktioniert aber (noch) nicht für negative Zahlen .. und speziell dazu: ich dachte wir lösen keine Hausaufgaben direkt?


----------



## Bleiglanz (20. Dez 2005)

```
x = (double) (long) (x + 0.5);
```
ist für Anfänger verwirrend weil ein unnötiger cast drin ist

```
x = (long) (x + 0.5);
```

im übrigen gibts noch eine Lösung ohne Math.round oder BigDecimal

```
public static double rundeTrick(double x, int stellen){
        NumberFormat nf = NumberFormat.getInstance(Locale.US);
        nf.setGroupingUsed(false);
        nf.setMaximumFractionDigits(stellen);
        return Double.valueOf(nf.format(x)).doubleValue();
    }
```


----------



## SnooP (20. Dez 2005)

Die Lösung würde ich als Hiwi aber auch nicht haben wollen  ... die Idee war, dass die Studenten natürlich was selbst programmieren sollen und keine Tricks benutzen


----------

