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)