W E R K S T A T T Rundung und Casting von Zahlen Intrexx 7.0
1. Einleitung In diesem Werkstattbeitrag erfahren Sie, wie Zahlenwerte speziell in Velocity, aber auch in Groovy, gerundet werden können. Für eine typsichere Weiterverarbeitung der Daten wird außerdem erklärt, wie Sie Variablen entsprechend casten können. Wir zeigen Ihnen in dem Beitrag einige Einsatzszenarien sowie einzelne Praxisbeispiele. Intrexx stellt für Rundungsund Casting-Anforderungen über das Objekt $Math unterstützende Methoden bereit. Die dazugehörige Java-API-Dokumentation finden Sie hier. 1.1. Voraussetzungen Ab der Version Intrexx 5.2 erhalten Sie die demonstrierten Rundungs- und Casting-Methoden von $Math bereits in der Release-Version. Beim Einsatz von Intrexx 5.1 wird ein installiertes Online-Update 07 benötigt. 2. Rundungsverfahren Zum Runden von Zahlenwerten existiert eine Vielzahl an Verfahren. Im Folgenden sollen das kaufmännische und das mathematischen Runden etwas genauer beschrieben werden. Beide Rundungsverfahren werden von Intrexx unterstützt. Je nach Anwendungsfall bieten unsere Templates hierfür die passende Methode. 2.1. Kaufmännisches Runden Die Regeln für kaufmännisches Runden sind wie folgt: Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 0,1,2,3 oder 4, dann wird abgerundet Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 5,6,7,8 oder 9, dann wird aufgerundet Negative Zahlen werden anhand ihres Betrags gerundet, d.h. also ab der Zahl 5 weg von 0. Beispiel (Runden auf zwei Nachkommastellen): 12,3449 -> 12,34 12,3450 -> 12,35-12,3449 -> -12,34-12,3450 -> -12,35 Für das kaufmännische Runden stellt Intrexx Ihnen die Methode roundhalfawayfromzero(double, precision) und roundhalfawayfromzero(bigdecimal, precision) zur Verfügung. Der zweite Parameter precision beschreibt hierbei die Anzahl der Nachkommastellen und ist optional. 2.2. Mathematisches Runden Die Regeln für mathematisches Runden sind wie folgt: Folgt auf die letzte beizubehaltende Ziffer eine 0, 1, 2, 3 oder 4, so wird abgerundet. Folgt auf die letzte beizubehaltende Ziffer eine 5, 6, 7, 8 oder eine 9, gefolgt von weiteren Ziffern, die nicht alle null sind, so wird aufgerundet. Folgt auf die letzte beizubehaltende Ziffer lediglich eine 5 (oder eine 5, auf die nur Nullen folgen), so wird derart gerundet, dass die letzte beizubehaltende Ziffer gerade wird. Beispiel (Runden auf eine Nachkommastelle): 1,2499 -> 1,2 1,2501 -> 1,3 1,2500 -> 1,2 1,3500 -> 1,4 Für das mathematische Runden stellt Intrexx Ihnen die Methode $Math.roundHalfEven() zur Verfügung. UNITED PLANET - INTREXX 7 - RUNDUNG UND CASTING VON ZAHLEN 2
2.3. Unterschiede Die Unterschiede zwischen den beiden vorgestellten Rundungsmethoden liegen in der "Verarbeitung" der Zahl 5, d.h. wenn eine Zahl zwischen zwei möglichen Rundungsergebnissen liegt. Beim kaufmännischen Runden kann lediglich der Fall vorkommen, dass um einen Wert von 0,5 aufgerundet wird. Das Abrunden von 0,5 kann zu keinem Zeitpunkt vorkommen. Dieser Fall ist dagegen beim mathematischen Runden berücksichtigt und sorgt dafür, dass beide Regeln gleichermaßen angewandt werden. Anwender müssen somit für jeden Anwendungsfall entscheiden, welches Rundungsverfahren hierfür rechnerisch, syntaktisch und logisch korrekt ist. Weitere Hintergründe zur Rundung von Zahlen finden Sie bei Wikipedia. 3. Methoden im Überblick In Velocity stellt Ihnen Intrexx wie bereits erwähnt das Objekt $Math zur Verfügung, mit dem Rundungsoperationen durchgeführt werden können. Im Folgenden sollen einige Methoden einzeln vorgestellt werden. Eine Gesamtübersicht finden Sie in der Java-API Dokumentation. roundhalfup(double param) Diese Methode rundet immer auf den nächsten Wert zum Übergabeparameter in positiver Richtung auf. $Math.roundHalfUp(0.5) == 1.0 $Math.roundHalfUp(-0.5) == 0.0 --- roundhalfawayfromzero(double param) Diese Methode rundet ähnlich wie roundhalfup(), außer dass negative Werte immer von dem Wert Null weggerundet werden. $Math.roundHalfAwayFromZero(0.5) == 1.0 $Math.roundHalfAwayFromZero(-0.5) == -1.0 --- roundhalfeven(double param) Auch diese Methode rundet wie roundhalfup(), jedoch werden Werte immer zum nächsten geraden Wert gerundet. $Math.roundHalfEven(1.5) == 2.0 $Math.roundHalfEven(-1.5) == -2.0 $Math.roundHalfEven(0.12) == 0.0 $Math.roundHalfEven(0.61) == 1.0 $Math.roundHalfEven(-0.61) == -1.0 Die beiden Methoden roundhalfawayfromzero() und roundhalfeven() akzeptieren optional einen zweiten Übergabeparameter für die Rundungsgenauigkeit. Hiermit können Sie angeben, auf wie viele Stellen nach dem Komma gerundet werden soll. Negative Werte sind dabei auch möglich, um die Genauigkeit vor dem Komma zu beeinflussen. 4. Typsichere Weiterverarbeitung Hin und wieder ist es erforderlich, dass die Zahlen einem bestimmten Typ entsprechen müssen. Auch hierfür haben Sie einige Möglichkeiten zur Verfügung. Im Rahmen des Rundens stehen für die oben genannten Methoden auch die entsprechenden Pendants zur Verfügung, um die gerundeten Werte in einem bestimmten Datentyp zurückgeliefert zu bekommen. Im Beispiel sieht der Aufruf dann wie folgt aus: UNITED PLANET - INTREXX 7 - RUNDUNG UND CASTING VON ZAHLEN 3
$Math.roundHalfUpAsInt(double) $Math.roundHalfUpAsLong(double) Selbstverständlich gibt es auch universelle Cast-Methoden, die vom $Math-Objekt bereitgestellt werden. Hierzu zählen: $Math.toInteger(java.lang.Object p_value) $Math.toLong(java.lang.Object p_value) $Math.toFloat(java.lang.Object p_value) $Math.toDouble(java.lang.Object p_value) $Math.toBigDecimal(java.lang.Object p_value) Jede dieser Methoden akzeptiert einen Übergabeparameter vom Typ java.lang.object, somit können unter anderem auch Zeichenketten (Strings) übergeben und umgewandelt werden. Im Falle von Zeichenketten dürfen sich jedoch keinerlei Trennzeichen wie Tausendertrennzeichen oder Dezimaltrenner befinden. Optional können Sie auch immer einen Fallback-Wert des entsprechenden Typs mitgeben. Falls eine Umwandlung nicht funktionieren sollte, wird dieser Fallback-Wert zurückgegeben. Ebenfalls abgefangen werden beim Casten mit Hilfe dieser Methoden eventuelle auftretende Bereichsüberlaufe. 5. Verwendung in Groovy Die aufgeführten Methoden roundhalfawayfromzero() und roundhalfeven() sind im Groovy- Umfeld ebenfalls aufrufbar. Importieren Sie hierzu die Klasse de.uplanet.util.math.roundingutil in Ihr Skript. Zum typsicheren Arbeiten und Casten stehen in Groovy keine speziellen Methoden zur Verfügung, da in diesem Fall auf die Groovy-eigenen Methoden zurückgegriffen werden kann. UNITED PLANET - INTREXX 7 - RUNDUNG UND CASTING VON ZAHLEN 4
2015 United Planet. All rights reserved. www.unitedplanet.com. Intrexx and United Planet are registered trademarks of United Planet, Freiburg - Germany. Alle im Text erwähnten Hersteller, Produkte und Dienstleistungen sind Marken oder eingetragene Marken der jeweiligen Unternehmen in Deutschland und anderen Ländern weltweit.