Rundungsmodus BigDecimal

Eine Besonderheit stellt die Methode divide(…) dar, die zusätzlich einen Rundungsmodus und optional auch eine Anzahl gültiger Nachkommastellen bekommen kann. Zunächst ohne Rundungsmodus:

BigDecimal a = new BigDecimal( "10" );
BigDecimal b = new BigDecimal( "2" );
System.out.println( a.divide(b) );   // 5

Es ist kein Problem, wenn das Ergebnis eine Ganzzahl oder das Ergebnis exakt ist:

System.out.println( BigDecimal.ONE.divide(b) );  // 0.5

Wenn das Ergebnis aber nicht exakt ist, lässt sich divide(…) nicht einsetzen. Die Anweisung new BigDecimal(1).divide( new BigDecimal(3) ) ergibt den Laufzeitfehler: „java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.“

An dieser Stelle kommen diverse Rundungsmodi ins Spiel, die bestimmen, wie die letzte Ziffer einer Rundung bestimmt werden soll. Sie lassen sich über eine Aufzählung java.math.RoundingMode übermitteln. Folgende Konstanten gibt es:

Konstante in RoundingMode Bedeutung
DOWN Runden nach 0
UP Runden weg von 0
FLOOR Runden nach negativ unendlich
CEILING Runden nach positiv unendlich
HALF_DOWN Runden zum nächsten Nachbarn und weg von der 0, wenn beide Nachbarn gleich weit weg sind
HALF_UP Runden zum nächsten Nachbarn und hin zur 0, wenn beide Nachbarn gleich weit weg sind
HALF_EVEN Runden zum nächsten Nachbarn und zum geraden Nachbarn, wenn beide Nachbarn gleich weit weg sind
UNNECESSARY Kein Runden, Operation muss exakt sein

 

ROUND_UNNECESSARY darf nur dann verwendet werden, wenn die Division exakt ist, sonst gibt es eine ArithmeticException.

BigDecimal one   = BigDecimal.ONE;

BigDecimal three = new BigDecimal( "3" );

System.out.println( one.divide( three, RoundingMode.UP ) );      // 1

System.out.println( one.divide( three, RoundingMode.DOWN ) );    // 0

Jetzt kann noch die Anzahl der Nachkommastellen bestimmt werden:

System.out.println( one.divide( three, 6, RoundingMode.UP ) );   // 0.333334

System.out.println( one.divide( three, 6, RoundingMode.DOWN ) ); // 0.333333

Beispiel

BigDecimal bietet die praktische Methode setScale(…) an, mit der sich die Anzahl der Nachkommastellen setzen lässt. Das ist zum Runden sehr gut. In unserem Beispiel sollen 45 Liter Benzin zu 1,399 bezahlt werden:

BigDecimal petrol = new BigDecimal( "1.399" ).multiply( new BigDecimal(45) );
 System.out.println( petrol.setScale( 3, BigDecimal.ROUND_HALF_UP ) );
 System.out.println( petrol.setScale( 2, BigDecimal.ROUND_HALF_UP ) );

Die Ausgaben sind 62955 und 6296.

class java.math.BigDecimal
extends Number
implements Comparable<BigDecimal>

  • BigDecimal divide(BigDecimal divisor,RoundingMode roundingMode)
  • BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
  • BigDecimal setScale(int newScale,RoundingMode roundingMode)

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert