{"id":3626,"date":"2017-02-20T09:37:09","date_gmt":"2017-02-20T07:37:09","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3626"},"modified":"2017-02-20T09:37:09","modified_gmt":"2017-02-20T07:37:09","slug":"rundungsmodus-bigdecimal","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/rundungsmodus-bigdecimal\/","title":{"rendered":"Rundungsmodus BigDecimal"},"content":{"rendered":"<p>Eine Besonderheit stellt die Methode divide(\u2026) dar, die zus\u00e4tzlich einen Rundungsmodus und optional auch eine Anzahl g\u00fcltiger Nachkommastellen bekommen kann. Zun\u00e4chst ohne Rundungsmodus:<\/p>\n<pre>BigDecimal\u00a0a\u00a0=\u00a0new\u00a0BigDecimal(\u00a0\"10\"\u00a0);\nBigDecimal\u00a0b\u00a0=\u00a0new\u00a0BigDecimal(\u00a0\"2\"\u00a0);\nSystem.out.println(\u00a0a.divide(b)\u00a0);\u00a0\u00a0\u00a0\/\/\u00a05<\/pre>\n<p>Es ist kein Problem, wenn das Ergebnis eine Ganzzahl oder das Ergebnis exakt ist:<\/p>\n<pre>System.out.println(\u00a0BigDecimal.ONE.divide(b)\u00a0);\u00a0\u00a0\/\/\u00a00.5<\/pre>\n<p>Wenn das Ergebnis aber nicht exakt ist, l\u00e4sst sich divide(\u2026) nicht einsetzen. Die Anweisung new\u00a0BigDecimal(1).divide(\u00a0new\u00a0BigDecimal(3)\u00a0) ergibt den Laufzeitfehler: \u201ejava.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.\u201c<\/p>\n<p>An dieser Stelle kommen diverse Rundungsmodi ins Spiel, die bestimmen, wie die letzte Ziffer einer Rundung bestimmt werden soll. Sie lassen sich \u00fcber eine Aufz\u00e4hlung java.math.RoundingMode \u00fcbermitteln. Folgende Konstanten gibt es:<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"298\">Konstante in RoundingMode<\/td>\n<td width=\"298\">Bedeutung<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">DOWN<\/td>\n<td width=\"298\">Runden nach 0<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">UP<\/td>\n<td width=\"298\">Runden weg von 0<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">FLOOR<\/td>\n<td width=\"298\">Runden nach negativ unendlich<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">CEILING<\/td>\n<td width=\"298\">Runden nach positiv unendlich<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">HALF_DOWN<\/td>\n<td width=\"298\">Runden zum n\u00e4chsten Nachbarn und weg von der 0, wenn beide Nachbarn gleich weit weg sind<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">HALF_UP<\/td>\n<td width=\"298\">Runden zum n\u00e4chsten Nachbarn und hin zur 0, wenn beide Nachbarn gleich weit weg sind<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">HALF_EVEN<\/td>\n<td width=\"298\">Runden zum n\u00e4chsten Nachbarn und zum geraden Nachbarn, wenn beide Nachbarn gleich weit weg sind<\/td>\n<\/tr>\n<tr>\n<td width=\"298\">UNNECESSARY<\/td>\n<td width=\"298\">Kein Runden, Operation muss exakt sein<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>ROUND_UNNECESSARY darf nur dann verwendet werden, wenn die Division exakt ist, sonst gibt es eine ArithmeticException.<\/p>\n<pre>BigDecimal one\u00a0\u00a0 = BigDecimal.ONE;\n\nBigDecimal three = new BigDecimal( \"3\" );\n\nSystem.out.println( one.divide( three, <strong>RoundingMode.UP<\/strong> ) );\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ 1\n\nSystem.out.println( one.divide( three, <strong>RoundingMode.DOWN<\/strong> ) );\u00a0\u00a0\u00a0 \/\/ 0<\/pre>\n<p>Jetzt kann noch die Anzahl der Nachkommastellen bestimmt werden:<\/p>\n<pre>System.out.println( one.divide( three, 6, RoundingMode.UP ) );\u00a0\u00a0 \/\/ 0.333334\n\nSystem.out.println( one.divide( three, 6, RoundingMode.DOWN ) ); \/\/ 0.333333<\/pre>\n<p>Beispiel<\/p>\n<p>BigDecimal bietet die praktische Methode setScale(\u2026) an, mit der sich die Anzahl der Nachkommastellen setzen l\u00e4sst. Das ist zum Runden sehr gut. In unserem Beispiel sollen 45 Liter Benzin zu 1,399 bezahlt werden:<\/p>\n<pre>BigDecimal\u00a0petrol\u00a0=\u00a0new\u00a0BigDecimal(\u00a0\"1.399\"\u00a0).multiply(\u00a0new\u00a0BigDecimal(45)\u00a0);\n System.out.println(\u00a0petrol.setScale(\u00a03,\u00a0BigDecimal.ROUND_HALF_UP\u00a0)\u00a0);\n System.out.println(\u00a0petrol.setScale(\u00a02,\u00a0BigDecimal.ROUND_HALF_UP\u00a0)\u00a0);<\/pre>\n<p>Die Ausgaben sind 62955 und 6296.<\/p>\n<p>class\u00a0java.math.BigDecimal<br \/>\nextends\u00a0Number<br \/>\nimplements\u00a0Comparable&lt;BigDecimal&gt;<\/p>\n<ul>\n<li>BigDecimal divide(BigDecimal divisor,RoundingMode roundingMode)<\/li>\n<li>BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)<\/li>\n<li>BigDecimal setScale(int newScale,RoundingMode roundingMode)<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Eine Besonderheit stellt die Methode divide(\u2026) dar, die zus\u00e4tzlich einen Rundungsmodus und optional auch eine Anzahl g\u00fcltiger Nachkommastellen bekommen kann. Zun\u00e4chst ohne Rundungsmodus: BigDecimal\u00a0a\u00a0=\u00a0new\u00a0BigDecimal(\u00a0&#8222;10&#8220;\u00a0); BigDecimal\u00a0b\u00a0=\u00a0new\u00a0BigDecimal(\u00a0&#8222;2&#8220;\u00a0); System.out.println(\u00a0a.divide(b)\u00a0);\u00a0\u00a0\u00a0\/\/\u00a05 Es ist kein Problem, wenn das Ergebnis eine Ganzzahl oder das Ergebnis exakt ist: System.out.println(\u00a0BigDecimal.ONE.divide(b)\u00a0);\u00a0\u00a0\/\/\u00a00.5 Wenn das Ergebnis aber nicht exakt ist, l\u00e4sst sich divide(\u2026) nicht einsetzen. Die Anweisung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-3626","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3626"}],"version-history":[{"count":5,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3626\/revisions"}],"predecessor-version":[{"id":3631,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3626\/revisions\/3631"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}