Kaufmännisches Runden mit BigDecimal

andrade

Mitglied
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:
Java:
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:
Java:
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!
 
Zuletzt bearbeitet von einem Moderator:
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...
 
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
 
weil bei Deiner Deklaration
Java:
 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:
Java:
double val = 77.48;
BigDecimal.valueOf(val);
 
Zuletzt bearbeitet:
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.
 
Ist dir diese Zeile auch aufgefallen?
Java:
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 🙂
 
So sieht der Methodenaufruf aus. Könnt ihr mir da mal bitte ein konkretes Beispiel nennen, was ich da eingeben kann?
 

Anhänge

  • methode.png
    methode.png
    45,2 KB · Aufrufe: 35
  • methode2.png
    methode2.png
    46,8 KB · Aufrufe: 59
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.
 
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
 
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.
 
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.
 
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)
 
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.
 

Zurück
Oben