---
title: 'Rundungsmodus BigDecimal'
url: 'https://tutego.de/blog/javainsel/2017/02/rundungsmodus-bigdecimal'
markdown: 'https://tutego.de/blog/javainsel/2017/02/rundungsmodus-bigdecimal.md'
date: '2017-02-20'
description: "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)\_);\_…"
taxonomy:
  category:
    - Allgemein
---

# Rundungsmodus BigDecimal

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://tutego.de/blog/javainsel/)

## Rundungsmodus BigDecimal

20.02.2017 · [Christian Ullenboom](https://tutego.de/blog/javainsel/author/admin/)

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:

```java
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:

```java
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 RoundingModeBedeutungDOWNRunden nach 0UPRunden weg von 0FLOORRunden nach negativ `unendlichCEILINGRunden` nach positiv `unendlichHALF`\_DOWNRunden zum nächsten Nachbarn und weg von der 0, wenn beide Nachbarn gleich weit weg `sindHALF`\_UPRunden zum nächsten Nachbarn und hin zur 0, wenn beide Nachbarn gleich weit weg `sindHALF`\_EVENRunden zum nächsten Nachbarn und zum geraden Nachbarn, wenn beide Nachbarn gleich weit weg `sindUNNECESSARYKein` Runden, Operation muss exakt sein

ROUND\_UNNECESSARY darf nur dann verwendet werden, wenn die Division exakt ist, sonst gibt es eine `ArithmeticException`.

```java
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:

```java
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:

```java
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)`

Kategorien: [Allgemein](https://tutego.de/blog/javainsel/category/allgemein/)

[← Alle Beiträge](https://tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Erweiterung von @Deprecated](https://tutego.de/blog/javainsel/2017/02/erweiterung-von-deprecated.md)
- Next: [Multiply-Accumulate, fma(...)](https://tutego.de/blog/javainsel/2017/02/multiply-accumulate-fma.md)
