/** @license Copyright (c) 2012 Daniel Trebbien and other contributors Portions Copyright (c) 2003 STZ-IDA and PTV AG, Karlsruhe, Germany Portions Copyright (c) 1995-2001 International Business Machines Corporation and others All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. */ (function () { var MathContext = (function () { /* Generated from 'MathContext.nrx' 8 Sep 2000 11:07:48 [v2.00] */ /* Options: Binary Comments Crossref Format Java Logo Strictargs Strictcase Trace2 Verbose3 */ //--package com.ibm.icu.math; /* ------------------------------------------------------------------ */ /* MathContext -- Math context settings */ /* ------------------------------------------------------------------ */ /* Copyright IBM Corporation, 1997, 2000. All Rights Reserved. */ /* */ /* The MathContext object encapsulates the settings used by the */ /* BigDecimal class; it could also be used by other arithmetics. */ /* ------------------------------------------------------------------ */ /* Notes: */ /* */ /* 1. The properties are checked for validity on construction, so */ /* the BigDecimal class may assume that they are correct. */ /* ------------------------------------------------------------------ */ /* Author: Mike Cowlishaw */ /* 1997.09.03 Initial version (edited from netrexx.lang.RexxSet) */ /* 1997.09.12 Add lostDigits property */ /* 1998.05.02 Make the class immutable and final; drop set methods */ /* 1998.06.05 Add Round (rounding modes) property */ /* 1998.06.25 Rename from DecimalContext; allow digits=0 */ /* 1998.10.12 change to com.ibm.icu.math package */ /* 1999.02.06 add javadoc comments */ /* 1999.03.05 simplify; changes from discussion with J. Bloch */ /* 1999.03.13 1.00 release to IBM Centre for Java Technology */ /* 1999.07.10 1.04 flag serialization unused */ /* 2000.01.01 1.06 copyright update */ /* ------------------------------------------------------------------ */ /* JavaScript conversion (c) 2003 STZ-IDA and PTV AG, Karlsruhe, Germany */ /** * The MathContext immutable class encapsulates the * settings understood by the operator methods of the {@link BigDecimal} * class (and potentially other classes). Operator methods are those * that effect an operation on a number or a pair of numbers. *

* The settings, which are not base-dependent, comprise: *

    *
  1. digits: * the number of digits (precision) to be used for an operation *
  2. form: * the form of any exponent that results from the operation *
  3. lostDigits: * whether checking for lost digits is enabled *
  4. roundingMode: * the algorithm to be used for rounding. *
*

* When provided, a MathContext object supplies the * settings for an operation directly. *

* When MathContext.DEFAULT is provided for a * MathContext parameter then the default settings are used * (9, SCIENTIFIC, false, ROUND_HALF_UP). *

* In the BigDecimal class, all methods which accept a * MathContext object defaults) also have a version of the * method which does not accept a MathContext parameter. These versions * carry out unlimited precision fixed point arithmetic (as though the * settings were (0, PLAIN, false, ROUND_HALF_UP). *

* The instance variables are shared with default access (so they are * directly accessible to the BigDecimal class), but must * never be changed. *

* The rounding mode constants have the same names and values as the * constants of the same name in java.math.BigDecimal, to * maintain compatibility with earlier versions of * BigDecimal. * * @see BigDecimal * @author Mike Cowlishaw * @stable ICU 2.0 */ //--public final class MathContext implements java.io.Serializable{ //--private static final java.lang.String $0="MathContext.nrx"; //-- methods MathContext.prototype.getDigits = getDigits; MathContext.prototype.getForm = getForm; MathContext.prototype.getLostDigits = getLostDigits; MathContext.prototype.getRoundingMode = getRoundingMode; MathContext.prototype.toString = toString; MathContext.prototype.isValidRound = isValidRound; /* ----- Properties ----- */ /* properties public constant */ /** * Plain (fixed point) notation, without any exponent. * Used as a setting to control the form of the result of a * BigDecimal operation. * A zero result in plain form may have a decimal part of one or * more zeros. * * @see #ENGINEERING * @see #SCIENTIFIC * @stable ICU 2.0 */ //--public static final int PLAIN=0; // [no exponent] MathContext.PLAIN = MathContext.prototype.PLAIN = 0; // [no exponent] /** * Standard floating point notation (with scientific exponential * format, where there is one digit before any decimal point). * Used as a setting to control the form of the result of a * BigDecimal operation. * A zero result in plain form may have a decimal part of one or * more zeros. * * @see #ENGINEERING * @see #PLAIN * @stable ICU 2.0 */ //--public static final int SCIENTIFIC=1; // 1 digit before . MathContext.SCIENTIFIC = MathContext.prototype.SCIENTIFIC = 1; // 1 digit before . /** * Standard floating point notation (with engineering exponential * format, where the power of ten is a multiple of 3). * Used as a setting to control the form of the result of a * BigDecimal operation. * A zero result in plain form may have a decimal part of one or * more zeros. * * @see #PLAIN * @see #SCIENTIFIC * @stable ICU 2.0 */ //--public static final int ENGINEERING=2; // 1-3 digits before . MathContext.ENGINEERING = MathContext.prototype.ENGINEERING = 2; // 1-3 digits before . // The rounding modes match the original BigDecimal class values /** * Rounding mode to round to a more positive number. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If any of the discarded digits are non-zero then the result * should be rounded towards the next more positive digit. * @stable ICU 2.0 */ //--public static final int ROUND_CEILING=2; MathContext.ROUND_CEILING = MathContext.prototype.ROUND_CEILING = 2; /** * Rounding mode to round towards zero. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* All discarded digits are ignored (truncated). The result is * neither incremented nor decremented. * @stable ICU 2.0 */ //--public static final int ROUND_DOWN=1; MathContext.ROUND_DOWN = MathContext.prototype.ROUND_DOWN = 1; /** * Rounding mode to round to a more negative number. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If any of the discarded digits are non-zero then the result * should be rounded towards the next more negative digit. * @stable ICU 2.0 */ //--public static final int ROUND_FLOOR=3; MathContext.ROUND_FLOOR = MathContext.prototype.ROUND_FLOOR = 3; /** * Rounding mode to round to nearest neighbor, where an equidistant * value is rounded down. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If the discarded digits represent greater than half (0.5 times) * the value of a one in the next position then the result should be * rounded up (away from zero). Otherwise the discarded digits are * ignored. * @stable ICU 2.0 */ //--public static final int ROUND_HALF_DOWN=5; MathContext.ROUND_HALF_DOWN = MathContext.prototype.ROUND_HALF_DOWN = 5; /** * Rounding mode to round to nearest neighbor, where an equidistant * value is rounded to the nearest even neighbor. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If the discarded digits represent greater than half (0.5 times) * the value of a one in the next position then the result should be * rounded up (away from zero). If they represent less than half, * then the result should be rounded down. *

* Otherwise (they represent exactly half) the result is rounded * down if its rightmost digit is even, or rounded up if its * rightmost digit is odd (to make an even digit). * @stable ICU 2.0 */ //--public static final int ROUND_HALF_EVEN=6; MathContext.ROUND_HALF_EVEN = MathContext.prototype.ROUND_HALF_EVEN = 6; /** * Rounding mode to round to nearest neighbor, where an equidistant * value is rounded up. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If the discarded digits represent greater than or equal to half * (0.5 times) the value of a one in the next position then the result * should be rounded up (away from zero). Otherwise the discarded * digits are ignored. * @stable ICU 2.0 */ //--public static final int ROUND_HALF_UP=4; MathContext.ROUND_HALF_UP = MathContext.prototype.ROUND_HALF_UP = 4; /** * Rounding mode to assert that no rounding is necessary. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* Rounding (potential loss of information) is not permitted. * If any of the discarded digits are non-zero then an * ArithmeticException should be thrown. * @stable ICU 2.0 */ //--public static final int ROUND_UNNECESSARY=7; MathContext.ROUND_UNNECESSARY = MathContext.prototype.ROUND_UNNECESSARY = 7; /** * Rounding mode to round away from zero. * Used as a setting to control the rounding mode used during a * BigDecimal operation. *

* If any of the discarded digits are non-zero then the result will * be rounded up (away from zero). * @stable ICU 2.0 */ //--public static final int ROUND_UP=0; MathContext.ROUND_UP = MathContext.prototype.ROUND_UP = 0; /* properties shared */ /** * The number of digits (precision) to be used for an operation. * A value of 0 indicates that unlimited precision (as many digits * as are required) will be used. *

* The {@link BigDecimal} operator methods use this value to * determine the precision of results. * Note that leading zeros (in the integer part of a number) are * never significant. *

* digits will always be non-negative. * * @serial */ //--int digits; /** * The form of results from an operation. *

* The {@link BigDecimal} operator methods use this value to * determine the form of results, in particular whether and how * exponential notation should be used. * * @see #ENGINEERING * @see #PLAIN * @see #SCIENTIFIC * @serial */ //--int form; // values for this must fit in a byte /** * Controls whether lost digits checking is enabled for an * operation. * Set to true to enable checking, or * to false to disable checking. *

* When enabled, the {@link BigDecimal} operator methods check * the precision of their operand or operands, and throw an * ArithmeticException if an operand is more precise * than the digits setting (that is, digits would be lost). * When disabled, operands are rounded to the specified digits. * * @serial */ //--boolean lostDigits; /** * The rounding algorithm to be used for an operation. *

* The {@link BigDecimal} operator methods use this value to * determine the algorithm to be used when non-zero digits have to * be discarded in order to reduce the precision of a result. * The value must be one of the public constants whose name starts * with ROUND_. * * @see #ROUND_CEILING * @see #ROUND_DOWN * @see #ROUND_FLOOR * @see #ROUND_HALF_DOWN * @see #ROUND_HALF_EVEN * @see #ROUND_HALF_UP * @see #ROUND_UNNECESSARY * @see #ROUND_UP * @serial */ //--int roundingMode; /* properties private constant */ // default settings //--private static final int DEFAULT_FORM=SCIENTIFIC; //--private static final int DEFAULT_DIGITS=9; //--private static final boolean DEFAULT_LOSTDIGITS=false; //--private static final int DEFAULT_ROUNDINGMODE=ROUND_HALF_UP; MathContext.prototype.DEFAULT_FORM=MathContext.prototype.SCIENTIFIC; MathContext.prototype.DEFAULT_DIGITS=9; MathContext.prototype.DEFAULT_LOSTDIGITS=false; MathContext.prototype.DEFAULT_ROUNDINGMODE=MathContext.prototype.ROUND_HALF_UP; /* properties private constant */ //--private static final int MIN_DIGITS=0; // smallest value for DIGITS. //--private static final int MAX_DIGITS=999999999; // largest value for DIGITS. If increased, MathContext.prototype.MIN_DIGITS=0; // smallest value for DIGITS. MathContext.prototype.MAX_DIGITS=999999999; // largest value for DIGITS. If increased, // the BigDecimal class may need update. // list of valid rounding mode values, most common two first //--private static final int ROUNDS[]=new int[]{ROUND_HALF_UP,ROUND_UNNECESSARY,ROUND_CEILING,ROUND_DOWN,ROUND_FLOOR,ROUND_HALF_DOWN,ROUND_HALF_EVEN,ROUND_UP}; MathContext.prototype.ROUNDS=new Array(MathContext.prototype.ROUND_HALF_UP,MathContext.prototype.ROUND_UNNECESSARY,MathContext.prototype.ROUND_CEILING,MathContext.prototype.ROUND_DOWN,MathContext.prototype.ROUND_FLOOR,MathContext.prototype.ROUND_HALF_DOWN,MathContext.prototype.ROUND_HALF_EVEN,MathContext.prototype.ROUND_UP); //--private static final java.lang.String ROUNDWORDS[]=new java.lang.String[]{"ROUND_HALF_UP","ROUND_UNNECESSARY","ROUND_CEILING","ROUND_DOWN","ROUND_FLOOR","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_UP"}; // matching names of the ROUNDS values MathContext.prototype.ROUNDWORDS=new Array("ROUND_HALF_UP","ROUND_UNNECESSARY","ROUND_CEILING","ROUND_DOWN","ROUND_FLOOR","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_UP"); // matching names of the ROUNDS values /* properties private constant unused */ // Serialization version //--private static final long serialVersionUID=7163376998892515376L; /* properties public constant */ /** * A MathContext object initialized to the default * settings for general-purpose arithmetic. That is, * digits=9 form=SCIENTIFIC lostDigits=false * roundingMode=ROUND_HALF_UP. * * @see #SCIENTIFIC * @see #ROUND_HALF_UP * @stable ICU 2.0 */ //--public static final com.ibm.icu.math.MathContext DEFAULT=new com.ibm.icu.math.MathContext(DEFAULT_DIGITS,DEFAULT_FORM,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); MathContext.prototype.DEFAULT=new MathContext(MathContext.prototype.DEFAULT_DIGITS,MathContext.prototype.DEFAULT_FORM,MathContext.prototype.DEFAULT_LOSTDIGITS,MathContext.prototype.DEFAULT_ROUNDINGMODE); /* ----- Constructors ----- */ /** * Constructs a new MathContext with a specified * precision. * The other settings are set to the default values * (see {@link #DEFAULT}). * * An IllegalArgumentException is thrown if the * setdigits parameter is out of range * (<0 or >999999999). * * @param setdigits The int digits setting * for this MathContext. * @throws IllegalArgumentException parameter out of range. * @stable ICU 2.0 */ //--public MathContext(int setdigits){ //-- this(setdigits,DEFAULT_FORM,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); //-- return;} /** * Constructs a new MathContext with a specified * precision and form. * The other settings are set to the default values * (see {@link #DEFAULT}). * * An IllegalArgumentException is thrown if the * setdigits parameter is out of range * (<0 or >999999999), or if the value given for the * setform parameter is not one of the appropriate * constants. * * @param setdigits The int digits setting * for this MathContext. * @param setform The int form setting * for this MathContext. * @throws IllegalArgumentException parameter out of range. * @stable ICU 2.0 */ //--public MathContext(int setdigits,int setform){ //-- this(setdigits,setform,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); //-- return;} /** * Constructs a new MathContext with a specified * precision, form, and lostDigits setting. * The roundingMode setting is set to its default value * (see {@link #DEFAULT}). * * An IllegalArgumentException is thrown if the * setdigits parameter is out of range * (<0 or >999999999), or if the value given for the * setform parameter is not one of the appropriate * constants. * * @param setdigits The int digits setting * for this MathContext. * @param setform The int form setting * for this MathContext. * @param setlostdigits The boolean lostDigits * setting for this MathContext. * @throws IllegalArgumentException parameter out of range. * @stable ICU 2.0 */ //--public MathContext(int setdigits,int setform,boolean setlostdigits){ //-- this(setdigits,setform,setlostdigits,DEFAULT_ROUNDINGMODE); //-- return;} /** * Constructs a new MathContext with a specified * precision, form, lostDigits, and roundingMode setting. * * An IllegalArgumentException is thrown if the * setdigits parameter is out of range * (<0 or >999999999), or if the value given for the * setform or setroundingmode parameters is * not one of the appropriate constants. * * @param setdigits The int digits setting * for this MathContext. * @param setform The int form setting * for this MathContext. * @param setlostdigits The boolean lostDigits * setting for this MathContext. * @param setroundingmode The int roundingMode setting * for this MathContext. * @throws IllegalArgumentException parameter out of range. * @stable ICU 2.0 */ //--public MathContext(int setdigits,int setform,boolean setlostdigits,int setroundingmode){super(); function MathContext() { //-- members this.digits = 0; this.form = 0; // values for this must fit in a byte this.lostDigits = false; this.roundingMode = 0; //-- overloaded ctor var setform = this.DEFAULT_FORM; var setlostdigits = this.DEFAULT_LOSTDIGITS; var setroundingmode = this.DEFAULT_ROUNDINGMODE; if (MathContext.arguments.length == 4) { setform = MathContext.arguments[1]; setlostdigits = MathContext.arguments[2]; setroundingmode = MathContext.arguments[3]; } else if (MathContext.arguments.length == 3) { setform = MathContext.arguments[1]; setlostdigits = MathContext.arguments[2]; } else if (MathContext.arguments.length == 2) { setform = MathContext.arguments[1]; } else if (MathContext.arguments.length != 1) { throw "MathContext(): " + MathContext.arguments.length + " arguments given; expected 1 to 4"; } var setdigits = MathContext.arguments[0]; // set values, after checking if (setdigits!=this.DEFAULT_DIGITS) { if (setdigitsthis.MAX_DIGITS) throw "MathContext(): Digits too large: "+setdigits; } {/*select*/ if (setform==this.SCIENTIFIC) {} // [most common] else if (setform==this.ENGINEERING) {} else if (setform==this.PLAIN) {} else{ throw "MathContext() Bad form value: "+setform; } } if ((!(this.isValidRound(setroundingmode)))) throw "MathContext(): Bad roundingMode value: "+setroundingmode; this.digits=setdigits; this.form=setform; this.lostDigits=setlostdigits; // [no bad value possible] this.roundingMode=setroundingmode; return;} /** * Returns the digits setting. * This value is always non-negative. * * @return an int which is the value of the digits * setting * @stable ICU 2.0 */ //--public int getDigits(){ function getDigits() { return this.digits; } /** * Returns the form setting. * This will be one of * {@link #ENGINEERING}, * {@link #PLAIN}, or * {@link #SCIENTIFIC}. * * @return an int which is the value of the form setting * @stable ICU 2.0 */ //--public int getForm(){ function getForm() { return this.form; } /** * Returns the lostDigits setting. * This will be either true (enabled) or * false (disabled). * * @return a boolean which is the value of the lostDigits * setting * @stable ICU 2.0 */ //--public boolean getLostDigits(){ function getLostDigits() { return this.lostDigits; } /** * Returns the roundingMode setting. * This will be one of * {@link #ROUND_CEILING}, * {@link #ROUND_DOWN}, * {@link #ROUND_FLOOR}, * {@link #ROUND_HALF_DOWN}, * {@link #ROUND_HALF_EVEN}, * {@link #ROUND_HALF_UP}, * {@link #ROUND_UNNECESSARY}, or * {@link #ROUND_UP}. * * @return an int which is the value of the roundingMode * setting * @stable ICU 2.0 */ //--public int getRoundingMode(){ function getRoundingMode() { return this.roundingMode; } /** Returns the MathContext as a readable string. * The String returned represents the settings of the * MathContext object as four blank-delimited words * separated by a single blank and with no leading or trailing blanks, * as follows: *

    *
  1. * digits=, immediately followed by * the value of the digits setting as a numeric word. *
  2. * form=, immediately followed by * the value of the form setting as an uppercase word * (one of SCIENTIFIC, PLAIN, or * ENGINEERING). *
  3. * lostDigits=, immediately followed by * the value of the lostDigits setting * (1 if enabled, 0 if disabled). *
  4. * roundingMode=, immediately followed by * the value of the roundingMode setting as a word. * This word will be the same as the name of the corresponding public * constant. *
*

* For example: *
* digits=9 form=SCIENTIFIC lostDigits=0 roundingMode=ROUND_HALF_UP * *

* Additional words may be appended to the result of * toString in the future if more properties are added * to the class. * * @return a String representing the context settings. * @stable ICU 2.0 */ //--public java.lang.String toString(){ function toString() { //--java.lang.String formstr=null; var formstr=null; //--int r=0; var r=0; //--java.lang.String roundword=null; var roundword=null; {/*select*/ if (this.form==this.SCIENTIFIC) formstr="SCIENTIFIC"; else if (this.form==this.ENGINEERING) formstr="ENGINEERING"; else{ formstr="PLAIN";/* form=PLAIN */ } } {var $1=this.ROUNDS.length;r=0;r:for(;$1>0;$1--,r++){ if (this.roundingMode==this.ROUNDS[r]) { roundword=this.ROUNDWORDS[r]; break r; } } }/*r*/ return "digits="+this.digits+" "+"form="+formstr+" "+"lostDigits="+(this.lostDigits?"1":"0")+" "+"roundingMode="+roundword; } /* Test whether round is valid. */ // This could be made shared for use by BigDecimal for setScale. //--private static boolean isValidRound(int testround){ function isValidRound(testround) { //--int r=0; var r=0; {var $2=this.ROUNDS.length;r=0;r:for(;$2>0;$2--,r++){ if (testround==this.ROUNDS[r]) return true; } }/*r*/ return false; } return MathContext; })(); var BigDecimal = (function (MathContext) { /* Generated from 'BigDecimal.nrx' 8 Sep 2000 11:10:50 [v2.00] */ /* Options: Binary Comments Crossref Format Java Logo Strictargs Strictcase Trace2 Verbose3 */ //--package com.ibm.icu.math; //--import java.math.BigInteger; //--import com.ibm.icu.impl.Utility; /* ------------------------------------------------------------------ */ /* BigDecimal -- Decimal arithmetic for Java */ /* ------------------------------------------------------------------ */ /* Copyright IBM Corporation, 1996, 2000. All Rights Reserved. */ /* */ /* The BigDecimal class provides immutable arbitrary-precision */ /* floating point (including integer) decimal numbers. */ /* */ /* As the numbers are decimal, there is an exact correspondence */ /* between an instance of a BigDecimal object and its String */ /* representation; the BigDecimal class provides direct conversions */ /* to and from String and character array objects, and well as */ /* conversions to and from the Java primitive types (which may not */ /* be exact). */ /* ------------------------------------------------------------------ */ /* Notes: */ /* */ /* 1. A BigDecimal object is never changed in value once constructed; */ /* this avoids the need for locking. Note in particular that the */ /* mantissa array may be shared between many BigDecimal objects, */ /* so that once exposed it must not be altered. */ /* */ /* 2. This class looks at MathContext class fields directly (for */ /* performance). It must not and does not change them. */ /* */ /* 3. Exponent checking is delayed until finish(), as we know */ /* intermediate calculations cannot cause 31-bit overflow. */ /* [This assertion depends on MAX_DIGITS in MathContext.] */ /* */ /* 4. Comments for the public API now follow the javadoc conventions. */ /* The NetRexx -comments option is used to pass these comments */ /* through to the generated Java code (with -format, if desired). */ /* */ /* 5. System.arraycopy is faster than explicit loop as follows */ /* Mean length 4: equal */ /* Mean length 8: x2 */ /* Mean length 16: x3 */ /* Mean length 24: x4 */ /* From prior experience, we expect mean length a little below 8, */ /* but arraycopy is still the one to use, in general, until later */ /* measurements suggest otherwise. */ /* */ /* 6. 'DMSRCN' referred to below is the original (1981) IBM S/370 */ /* assembler code implementation of the algorithms below; it is */ /* now called IXXRCN and is available with the OS/390 and VM/ESA */ /* operating systems. */ /* ------------------------------------------------------------------ */ /* Change History: */ /* 1997.09.02 Initial version (derived from netrexx.lang classes) */ /* 1997.09.12 Add lostDigits checking */ /* 1997.10.06 Change mantissa to a byte array */ /* 1997.11.22 Rework power [did not prepare arguments, etc.] */ /* 1997.12.13 multiply did not prepare arguments */ /* 1997.12.14 add did not prepare and align arguments correctly */ /* 1998.05.02 0.07 packaging changes suggested by Sun and Oracle */ /* 1998.05.21 adjust remainder operator finalization */ /* 1998.06.04 rework to pass MathContext to finish() and round() */ /* 1998.06.06 change format to use round(); support rounding modes */ /* 1998.06.25 rename to BigDecimal and begin merge */ /* zero can now have trailing zeros (i.e., exp\=0) */ /* 1998.06.28 new methods: movePointXxxx, scale, toBigInteger */ /* unscaledValue, valueof */ /* 1998.07.01 improve byteaddsub to allow array reuse, etc. */ /* 1998.07.01 make null testing explicit to avoid JIT bug [Win32] */ /* 1998.07.07 scaled division [divide(BigDecimal, int, int)] */ /* 1998.07.08 setScale, faster equals */ /* 1998.07.11 allow 1E6 (no sign) ; new double/float conversion */ /* 1998.10.12 change package to com.ibm.icu.math */ /* 1998.12.14 power operator no longer rounds RHS [to match ANSI] */ /* add toBigDecimal() and BigDecimal(java.math.BigDecimal) */ /* 1998.12.29 improve byteaddsub by using table lookup */ /* 1999.02.04 lostdigits=0 behaviour rounds instead of digits+1 guard */ /* 1999.02.05 cleaner code for BigDecimal(char[]) */ /* 1999.02.06 add javadoc comments */ /* 1999.02.11 format() changed from 7 to 2 method form */ /* 1999.03.05 null pointer checking is no longer explicit */ /* 1999.03.05 simplify; changes from discussion with J. Bloch: */ /* null no longer permitted for MathContext; drop boolean, */ /* byte, char, float, short constructor, deprecate double */ /* constructor, no blanks in string constructor, add */ /* offset and length version of char[] constructor; */ /* add valueOf(double); drop booleanValue, charValue; */ /* add ...Exact versions of remaining convertors */ /* 1999.03.13 add toBigIntegerExact */ /* 1999.03.13 1.00 release to IBM Centre for Java Technology */ /* 1999.05.27 1.01 correct 0-0.2 bug under scaled arithmetic */ /* 1999.06.29 1.02 constructors should not allow exponent > 9 digits */ /* 1999.07.03 1.03 lost digits should not be checked if digits=0 */ /* 1999.07.06 lost digits Exception message changed */ /* 1999.07.10 1.04 more work on 0-0.2 (scaled arithmetic) */ /* 1999.07.17 improve messages from pow method */ /* 1999.08.08 performance tweaks */ /* 1999.08.15 fastpath in multiply */ /* 1999.11.05 1.05 fix problem in intValueExact [e.g., 5555555555] */ /* 1999.12.22 1.06 remove multiply fastpath, and improve performance */ /* 2000.01.01 copyright update [Y2K has arrived] */ /* 2000.06.18 1.08 no longer deprecate BigDecimal(double) */ /* ------------------------------------------------------------------ */ /* JavaScript conversion (c) 2003 STZ-IDA and PTV AG, Karlsruhe, Germany */ function div(a, b) { return (a-(a%b))/b; } BigDecimal.prototype.div = div; function arraycopy(src, srcindex, dest, destindex, length) { var i; if (destindex > srcindex) { // in case src and dest are equals, but also doesn't hurt // if they are different for (i = length-1; i >= 0; --i) { dest[i+destindex] = src[i+srcindex]; } } else { for (i = 0; i < length; ++i) { dest[i+destindex] = src[i+srcindex]; } } } BigDecimal.prototype.arraycopy = arraycopy; function createArrayWithZeros(length) { var retVal = new Array(length); var i; for (i = 0; i < length; ++i) { retVal[i] = 0; } return retVal; } BigDecimal.prototype.createArrayWithZeros = createArrayWithZeros; /** * The BigDecimal class implements immutable * arbitrary-precision decimal numbers. The methods of the * BigDecimal class provide operations for fixed and * floating point arithmetic, comparison, format conversions, and * hashing. *

* As the numbers are decimal, there is an exact correspondence between * an instance of a BigDecimal object and its * String representation; the BigDecimal class * provides direct conversions to and from String and * character array (char[]) objects, as well as conversions * to and from the Java primitive types (which may not be exact) and * BigInteger. *

* In the descriptions of constructors and methods in this documentation, * the value of a BigDecimal number object is shown as the * result of invoking the toString() method on the object. * The internal representation of a decimal number is neither defined * nor exposed, and is not permitted to affect the result of any * operation. *

* The floating point arithmetic provided by this class is defined by * the ANSI X3.274-1996 standard, and is also documented at * http://www2.hursley.ibm.com/decimal *
[This URL will change.] * *

Operator methods

*

* Operations on BigDecimal numbers are controlled by a * {@link MathContext} object, which provides the context (precision and * other information) for the operation. Methods that can take a * MathContext parameter implement the standard arithmetic * operators for BigDecimal objects and are known as * operator methods. The default settings provided by the * constant {@link MathContext#DEFAULT} (digits=9, * form=SCIENTIFIC, lostDigits=false, roundingMode=ROUND_HALF_UP) * perform general-purpose floating point arithmetic to nine digits of * precision. The MathContext parameter must not be * null. *

* Each operator method also has a version provided which does * not take a MathContext parameter. For this version of * each method, the context settings used are digits=0, * form=PLAIN, lostDigits=false, roundingMode=ROUND_HALF_UP; * these settings perform fixed point arithmetic with unlimited * precision, as defined for the original BigDecimal class in Java 1.1 * and Java 1.2. *

* For monadic operators, only the optional MathContext * parameter is present; the operation acts upon the current object. *

* For dyadic operators, a BigDecimal parameter is always * present; it must not be null. * The operation acts with the current object being the left-hand operand * and the BigDecimal parameter being the right-hand operand. *

* For example, adding two BigDecimal objects referred to * by the names award and extra could be * written as any of: *

* award.add(extra) *
award.add(extra, MathContext.DEFAULT) *
award.add(extra, acontext) *
*

* (where acontext is a MathContext object), * which would return a BigDecimal object whose value is * the result of adding award and extra under * the appropriate context settings. *

* When a BigDecimal operator method is used, a set of * rules define what the result will be (and, by implication, how the * result would be represented as a character string). * These rules are defined in the BigDecimal arithmetic documentation * (see the URL above), but in summary: *