{"id":2595,"date":"2014-01-03T13:54:31","date_gmt":"2014-01-03T11:54:31","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2595"},"modified":"2014-01-03T13:54:31","modified_gmt":"2014-01-03T11:54:31","slug":"division-mit-rundung-richtung-negativ-unendlich-alternativer-restwert","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2014\/01\/division-mit-rundung-richtung-negativ-unendlich-alternativer-restwert\/","title":{"rendered":"Division mit Rundung Richtung negativ unendlich, alternativer Restwert"},"content":{"rendered":"<p>Die Ganzzahldivision in Java ist simpel gestrickt. Vereinfacht ausgedr\u00fcckt: Konvertiere die Ganzzahlen in Flie\u00dfkommazahlen, f\u00fchre die Division durch und schneide alles hinter dem Komma ab. So ergeben zum Beispiel 3 \/ 2 = 1 und 9 \/ 2 = 4. Bei negativem Ergebnis, durch entweder negativen Dividenden oder Divisor, das gleiche Spiel: -9 \/ 2 = -4 und 9 \/ -2 = -4. Schauen wir uns einmal die Rundungen an. <\/p>\n<p>Ist das Ergebnis einer Division positiv und mit Nachkommaanteil, so wird das Ergebnis durch das Abschneiden der Nachkommastellen ein wenig kleiner, also abgerundet. W\u00e4re 3\/2 bei Flie\u00dfkommazahlen 1,5, ist es bei einer Ganzzahldivision abgerundet 1. Bei negativen Ergebnissen einer Division ist das genau anders herum. Denn durch das Abschneiden der Nachkommastellen wird die Zahl etwas gr\u00f6\u00dfer. -3\/2 ist genau genommen -1,5, aber bei der Ganzzahldivision -1. Doch -1 ist gr\u00f6\u00dfer als -1,5. Java wendet ein Verfahren an, was gegen null rundet. <\/p>\n<h6>Methoden f\u00fcr Division gegen minus unendlich, floorDiv(\u2026)<\/h6>\n<\/p>\n<p>In Java 8 hat die Mathe-Klasse zwei neue Methoden bekommen, die bei negativem Ergebnis einer Division nicht gegen null runden, sondern gegen negativ unendlich, also auch in Richtung der kleineren Zahl, wie es bei den positiven Ergebnissen ist. <\/p>\n<p>class java.lang.Math <\/p>\n<p>class java.lang.StrictMath <\/p>\n<ul>\n<li>static int floorDiv(int x, int y)<\/li>\n<li>static long floorDiv(long x, long y)<\/li>\n<\/ul>\n<p>Ganz praktisch hei\u00dft das: 4\/2 = Math.floorDiv(4, 3) = 1 ist, aber wo -4 \/ 3 = -1 ergibt, liefert Math.floorDiv(-4, 3) = -2. <\/p>\n<h6>Methoden f\u00fcr Division gegen minus unendlich, floorMod(\u2026)<\/h6>\n<\/p>\n<p>Die Division taucht indirekt auch bei der Berechnung des Restwertes auf. Zur Erinnerung: der Zusammenhang zwischen Division a\/b und Restwert a%b (a hei\u00dft Dividend, b Divisor) ist (int)(a\/b) * b + (a%b) = a. In der Gleichung gibt es eine Division, doch da es mit a \/ b und floorDiv(a, b) zwei Arten von Divisionen gibt, muss es folglich auch zwei Arten von Restwertbildung geben, die sich dann unterscheiden, wenn die Vorzeichen unterschiedlich sind. Neben a % b gibt es daher die Bibliotheksmethode floorMod(a, b) und der Zusammenhang zwischen floorMod(\u2026) und floorDiv(\u2026) ist: floorDiv(a, b) * b + floorMod(a, b) == b. Nach einer Umformung der Gleichung folgt floorMod(a, b) = a &#8211; (floorDiv(a, b) * b). Das Ergebnis ist im Bereich -abs(b) und abs(b) und das Vorzeichen des Ergebnisses bestimmt der Divisor b (beim %-Operator ist es der Dividend a). <\/p>\n<p>Die Javdoc zeigt ein Beispiel mit den Werten 4 und 3 und unterschiedlichen Vorzeichen aus: <\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"348\">\n<p><b>floorMod(\u2026)-Methode<\/b><\/p>\n<\/td>\n<td valign=\"top\" width=\"348\">\n<p><b>%-Operator<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"348\">\n<p>floorMod(+4, +3) == +1<\/p>\n<\/td>\n<td valign=\"top\" width=\"348\">\n<p>+4 % +3 == +1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"348\">\n<p>floorMod(+4, -3) == -2<\/p>\n<\/td>\n<td valign=\"top\" width=\"348\">\n<p>+4 % -3 == +1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"348\">\n<p>floorMod(-4, +3) == +2<\/p>\n<\/td>\n<td valign=\"top\" width=\"348\">\n<p>-4 % +3 == -1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"348\">\n<p>floorMod(-4, -3) == -1<\/p>\n<\/td>\n<td valign=\"top\" width=\"348\">\n<p>-4 % -3 == -1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Ergebnis unterschiedlicher Restwertbildung <\/p>\n<p>Sind die Vorzeichen f\u00fcr a und b identisch, so ist auch das Ergebnis von floorMod(a, b) und a % b gleich. Die Beispiele in der Tabelle macht auch den Unterschied im Ergebnis-Vorzeichen deutlich, welches einmal vom Dividenden (%) und einem vom Divisor (floorMod(\u2026)) kommt. Die komplett anderen Ereignisse (vom Vorzeichen einmal abgesehen) beim Paar (+4,-3) und (-4,+3) ergeben sich ganz einfach aus unterschiedlichen Ergebnissen der Division: floorMod(+4, -3) = +4 &#8211; (floorDiv(+4, -3) * -3) = +4 &#8211; (<b>-2<\/b> * -3) = +4 &#8211; +6 = -2, w\u00e4hrend +4 % -3 = +4 &#8211; (+4\/-3 * -3) = +4 \u2013 (<b>-1<\/b> * -3) = +4 \u2013 3 = +1. <\/p>\n<p>class java.lang.Math <\/p>\n<p>class java.lang.StrictMath <\/p>\n<ul>\n<li>static int floorMod(int x, int y)<\/li>\n<li>static long floorMod(long x, long y)<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Die Ganzzahldivision in Java ist simpel gestrickt. Vereinfacht ausgedr\u00fcckt: Konvertiere die Ganzzahlen in Flie\u00dfkommazahlen, f\u00fchre die Division durch und schneide alles hinter dem Komma ab. So ergeben zum Beispiel 3 \/ 2 = 1 und 9 \/ 2 = 4. Bei negativem Ergebnis, durch entweder negativen Dividenden oder Divisor, das gleiche Spiel: -9 \/ 2 [&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":[11,66],"tags":[],"class_list":["post-2595","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2595","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=2595"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2595\/revisions"}],"predecessor-version":[{"id":2596,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2595\/revisions\/2596"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}