# Kaufmännisches Runden mit BigDecimal



## andrade (22. Jan 2016)

Hallo,
ich mach gerade zur Übung eine Aufgabe aus einem alten Skript und komme nicht weiter.
Die Methode public static BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz)
soll den Wert (betrag/100)*prozentsatz berechnen. 
Dabei soll mit kaufmännischer Rundung gerechnet werden. Die Genauigkeit (Anzahl der Dezimalstellen) soll über eine Klassenvariable gesteuert werden, die man über die Methode setDezimalstellen(…) setzen kann. Standardmäßig soll sie den Wert 5 haben.

Ich hab folgendes Template gegeben:

```
import java.math.BigDecimal;
public class Berechnung2 {
    /**
    * Diese Methode speichert die Anzahl der Nachkommastellen in einer Klassenvariable.
    */
    public static void setDezimalstellen(int dezimalstellen) {       
    }
    /**
    * Diese Methode berechnet einen Prozentwert unter Berücksichtigung der aktuell gültigen Nachkommastellenzahl.
    */
    public static BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz) {
        return null;
    }
}
```
Da hab ich aber enorme Probleme mit dem Aufruf von BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz), was muss ich da genau für Werte eingeben?
​Ich hab einmal zum Test, die folgende Klasse geschrieben, die so zu funktionieren scheint:

```
import java.math.BigDecimal;
public class BechnungTest
{
    public static BigDecimal prozent() {
        BigDecimal HUNDERT = new BigDecimal(100);
        BigDecimal betrag = new BigDecimal(14.99);
        BigDecimal prozentsatz = new BigDecimal(50);
        BigDecimal prozentwert = betrag
                              .multiply(prozentsatz)
                              .divide(HUNDERT);
        BigDecimal result = betrag.subtract(prozentwert);
        result = result.setScale(5, BigDecimal.ROUND_HALF_UP);
        System.out.println("Betrag: " + betrag);
        System.out.println("Prozentsatz: " + prozentsatz);
        System.out.println("Prozentwert: " + prozentwert);
        System.out.println("Ergebnis: " + result);
      
        return result;
   }
}
```
Nur wie setzt ich das nun um, dass meine Methoden die Signatur von oben haben? Oder noch wichtiger, was für Werte muss ich beim Methodenaufruf eingeben? Geb ich einfach die 14.99 und 50 ein wie im Test, bekomme ich die Meldung "Error: incompatible types: Double cannot be converted to java.math.BigDecimal".

Bin für jede Hilfe dankbar!
​


----------



## VfL_Freak (22. Jan 2016)

Moin,

Google kaputt ?? 
http://stackoverflow.com/questions/27780642/cant-put-double-number-in-bigdecimal-variable
http://stackoverflow.com/questions/...le-to-bigdecimal-and-set-bigdecimal-precision

Gruß Klaus


----------



## andrade (22. Jan 2016)

Nein! Ich beschäftige mich schon den ganzen Morgen damit, google ohne Ende. Aber hab wohl irgendwo ein Brett vor dem Kopf. Die beiden Seiten hatten ich auch schon gelesen.
Wenn ich aufrufe (bei uns mittels BlueJ) BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz), in welcher Art würdest du die Zahlen eingeben? Wie gesagt 14.99 z.B. geht nicht. "14.99" auch nicht und ich weiß nicht wieviele Versionen ich noch getestet habe...


----------



## VfL_Freak (22. Jan 2016)

Moin,

weder noch ... 
Hast Du die beiden Links überhaupt gelesen ?? 
Da steht doch ganz klar drin, wie Du den double in BigDecimal casten musst ... 

Gruß Klaus


----------



## andrade (22. Jan 2016)

Aber wieso double? In BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz) werden doch direkt BigDecimale gefordert?


----------



## VfL_Freak (22. Jan 2016)

weil bei Deiner Deklaration

```
BigDecimal betrag = new BigDecimal( 14.99 );
```
der Wert "14.99" nun mal ein Double ist 

Gruß Klaus

EDIT: einen Konstruktor gibt es schon, aber versuch es doch mal so, wie im zweiten Link beschrieben:

```
double val = 77.48;
BigDecimal.valueOf(val);
```


----------



## andrade (22. Jan 2016)

Okay, 14.99 ist ein double. Das seh ich nun auch 
Aber ich möchte ja nun direkt die Methode BigDecimal prozent(BigDecimal betrag, BigDecimal prozentsatz) aufrufen und dabei ja Parameter übergeben (durch direkt Eingabe der Daten).
Und da seh ich einfach nicht, in wiefern mir das von dir eingebrachte double val etc mir da helfen soll. Das hatte ich nämlich in dem Link auch schon gesehen. Ich hoffe ihr könnt mein Problem verstehen.


----------



## Joose (22. Jan 2016)

Ist dir diese Zeile auch aufgefallen?

```
BigDecimal.valueOf(val);
```
Schon mal geschaut diese macht? Du kannst direkt auf BigDecimal draufklicken und kommst damit zur Dokumentation. Dann lies dir einfach mal durch was die Methode "valueOf" macht und zurückliefert


----------



## andrade (22. Jan 2016)

So sieht der Methodenaufruf aus. Könnt ihr mir da mal bitte ein konkretes Beispiel nennen, was ich da eingeben kann?


----------



## Joose (22. Jan 2016)

Entschuldigung du hast zwar BlueJ erwähnt aber dabei dachten wir beide nicht an diese Eingabe sondern einen ganz normalen Methodenaufruf im Code 

"java.math.BigDecimal.valueOf(1.23)" musst du eingeben, habs bei mir gerade getestet. Ob es auch einfacher geht weiß ich nicht. Habe nie wirklich mit BlueJ gearbeitet.


----------



## andrade (22. Jan 2016)

Danke! Das hab ich nur gesucht. Wahrscheinlich muss es einfacher gehen. Das ganze wird mit einem Roboter kontrolliert und ich kann mir eigentlich nicht vorstellen, dass man so einen langen Aufruf eingeben muss


----------



## Joose (22. Jan 2016)

Naja wenn du diese Methode nicht über die BlueJ Oberfläche aufrufst sondern wirklich im Code dann reicht es BigDecimal zu importieren und "BigDecimal.valueOf(1.1)" zu schreiben.


----------



## andrade (22. Jan 2016)

BigDecimal ist natürlich importiert.
Laut Aufgabe soll ich die Methode mit den Aufrufparamtern testen:
 50, 20 
100, 0.1 
100, 0.000001 
1000, 0.000001 
Also muss es da noch eine Möglichkeit geben, auf die ich einfach nicht komme.


----------



## Joose (22. Jan 2016)

Kann es sein das du einfach in der "main" Methode ein Objekt deiner Klasse erstellen sollst und dann im Code die Methode mit diesen Parametern aufrufen sollst? (Und nicht über die BlueJ Oberfläche)


----------



## andrade (22. Jan 2016)

leider nein. Eine Mainmethode haben wir hier nicht und soll auch nicht hinzugefügt werden. Der Prof würde das dann über JUnit-Tests kontrollieren, ob alles richtig programmiert wurde.


----------

