1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // 2016 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 /* Generated from 'MathContext.nrx' 8 Sep 2000 11:07:48 [v2.00] */ 5 /* Options: Binary Comments Crossref Format Java Logo Strictargs Strictcase Trace2 Verbose3 */ 6 package android.icu.math; 7 8 /* ------------------------------------------------------------------ */ 9 /* MathContext -- Math context settings */ 10 /* ------------------------------------------------------------------ */ 11 /* Copyright IBM Corporation, 1997, 2000, 2005, 2007. All Rights Reserved. */ 12 /* */ 13 /* The MathContext object encapsulates the settings used by the */ 14 /* BigDecimal class; it could also be used by other arithmetics. */ 15 /* ------------------------------------------------------------------ */ 16 /* Notes: */ 17 /* */ 18 /* 1. The properties are checked for validity on construction, so */ 19 /* the BigDecimal class may assume that they are correct. */ 20 /* ------------------------------------------------------------------ */ 21 /* Author: Mike Cowlishaw */ 22 /* 1997.09.03 Initial version (edited from netrexx.lang.RexxSet) */ 23 /* 1997.09.12 Add lostDigits property */ 24 /* 1998.05.02 Make the class immutable and final; drop set methods */ 25 /* 1998.06.05 Add Round (rounding modes) property */ 26 /* 1998.06.25 Rename from DecimalContext; allow digits=0 */ 27 /* 1998.10.12 change to android.icu.math package */ 28 /* 1999.02.06 add javadoc comments */ 29 /* 1999.03.05 simplify; changes from discussion with J. Bloch */ 30 /* 1999.03.13 1.00 release to IBM Centre for Java Technology */ 31 /* 1999.07.10 1.04 flag serialization unused */ 32 /* 2000.01.01 1.06 copyright update */ 33 /* ------------------------------------------------------------------ */ 34 35 36 37 38 /** 39 * The <code>MathContext</code> immutable class encapsulates the 40 * settings understood by the operator methods of the {@link BigDecimal} 41 * class (and potentially other classes). Operator methods are those 42 * that effect an operation on a number or a pair of numbers. 43 * <p> 44 * The settings, which are not base-dependent, comprise: 45 * <ol> 46 * <li><code>digits</code>: 47 * the number of digits (precision) to be used for an operation 48 * <li><code>form</code>: 49 * the form of any exponent that results from the operation 50 * <li><code>lostDigits</code>: 51 * whether checking for lost digits is enabled 52 * <li><code>roundingMode</code>: 53 * the algorithm to be used for rounding. 54 * </ol> 55 * <p> 56 * When provided, a <code>MathContext</code> object supplies the 57 * settings for an operation directly. 58 * <p> 59 * When <code>MathContext.DEFAULT</code> is provided for a 60 * <code>MathContext</code> parameter then the default settings are used 61 * (<code>9, SCIENTIFIC, false, ROUND_HALF_UP</code>). 62 * <p> 63 * In the <code>BigDecimal</code> class, all methods which accept a 64 * <code>MathContext</code> object defaults) also have a version of the 65 * method which does not accept a MathContext parameter. These versions 66 * carry out unlimited precision fixed point arithmetic (as though the 67 * settings were (<code>0, PLAIN, false, ROUND_HALF_UP</code>). 68 * <p> 69 * The instance variables are shared with default access (so they are 70 * directly accessible to the <code>BigDecimal</code> class), but must 71 * never be changed. 72 * <p> 73 * The rounding mode constants have the same names and values as the 74 * constants of the same name in <code>java.math.BigDecimal</code>, to 75 * maintain compatibility with earlier versions of 76 * <code>BigDecimal</code>. 77 * 78 * @see BigDecimal 79 * @author Mike Cowlishaw 80 */ 81 82 public final class MathContext implements java.io.Serializable{ 83 //private static final java.lang.String $0="MathContext.nrx"; 84 85 /* ----- Properties ----- */ 86 /* properties public constant */ 87 /** 88 * Plain (fixed point) notation, without any exponent. 89 * Used as a setting to control the form of the result of a 90 * <code>BigDecimal</code> operation. 91 * A zero result in plain form may have a decimal part of one or 92 * more zeros. 93 * 94 * @see #ENGINEERING 95 * @see #SCIENTIFIC 96 */ 97 public static final int PLAIN=0; // [no exponent] 98 99 /** 100 * Standard floating point notation (with scientific exponential 101 * format, where there is one digit before any decimal point). 102 * Used as a setting to control the form of the result of a 103 * <code>BigDecimal</code> operation. 104 * A zero result in plain form may have a decimal part of one or 105 * more zeros. 106 * 107 * @see #ENGINEERING 108 * @see #PLAIN 109 */ 110 public static final int SCIENTIFIC=1; // 1 digit before . 111 112 /** 113 * Standard floating point notation (with engineering exponential 114 * format, where the power of ten is a multiple of 3). 115 * Used as a setting to control the form of the result of a 116 * <code>BigDecimal</code> operation. 117 * A zero result in plain form may have a decimal part of one or 118 * more zeros. 119 * 120 * @see #PLAIN 121 * @see #SCIENTIFIC 122 */ 123 public static final int ENGINEERING=2; // 1-3 digits before . 124 125 // The rounding modes match the original BigDecimal class values 126 /** 127 * Rounding mode to round to a more positive number. 128 * Used as a setting to control the rounding mode used during a 129 * <code>BigDecimal</code> operation. 130 * <p> 131 * If any of the discarded digits are non-zero then the result 132 * should be rounded towards the next more positive digit. 133 */ 134 public static final int ROUND_CEILING=2; 135 136 /** 137 * Rounding mode to round towards zero. 138 * Used as a setting to control the rounding mode used during a 139 * <code>BigDecimal</code> operation. 140 * <p> 141 * All discarded digits are ignored (truncated). The result is 142 * neither incremented nor decremented. 143 */ 144 public static final int ROUND_DOWN=1; 145 146 /** 147 * Rounding mode to round to a more negative number. 148 * Used as a setting to control the rounding mode used during a 149 * <code>BigDecimal</code> operation. 150 * <p> 151 * If any of the discarded digits are non-zero then the result 152 * should be rounded towards the next more negative digit. 153 */ 154 public static final int ROUND_FLOOR=3; 155 156 /** 157 * Rounding mode to round to nearest neighbor, where an equidistant 158 * value is rounded down. 159 * Used as a setting to control the rounding mode used during a 160 * <code>BigDecimal</code> operation. 161 * <p> 162 * If the discarded digits represent greater than half (0.5 times) 163 * the value of a one in the next position then the result should be 164 * rounded up (away from zero). Otherwise the discarded digits are 165 * ignored. 166 */ 167 public static final int ROUND_HALF_DOWN=5; 168 169 /** 170 * Rounding mode to round to nearest neighbor, where an equidistant 171 * value is rounded to the nearest even neighbor. 172 * Used as a setting to control the rounding mode used during a 173 * <code>BigDecimal</code> operation. 174 * <p> 175 * If the discarded digits represent greater than half (0.5 times) 176 * the value of a one in the next position then the result should be 177 * rounded up (away from zero). If they represent less than half, 178 * then the result should be rounded down. 179 * <p> 180 * Otherwise (they represent exactly half) the result is rounded 181 * down if its rightmost digit is even, or rounded up if its 182 * rightmost digit is odd (to make an even digit). 183 */ 184 public static final int ROUND_HALF_EVEN=6; 185 186 /** 187 * Rounding mode to round to nearest neighbor, where an equidistant 188 * value is rounded up. 189 * Used as a setting to control the rounding mode used during a 190 * <code>BigDecimal</code> operation. 191 * <p> 192 * If the discarded digits represent greater than or equal to half 193 * (0.5 times) the value of a one in the next position then the result 194 * should be rounded up (away from zero). Otherwise the discarded 195 * digits are ignored. 196 */ 197 public static final int ROUND_HALF_UP=4; 198 199 /** 200 * Rounding mode to assert that no rounding is necessary. 201 * Used as a setting to control the rounding mode used during a 202 * <code>BigDecimal</code> operation. 203 * <p> 204 * Rounding (potential loss of information) is not permitted. 205 * If any of the discarded digits are non-zero then an 206 * <code>ArithmeticException</code> should be thrown. 207 */ 208 public static final int ROUND_UNNECESSARY=7; 209 210 /** 211 * Rounding mode to round away from zero. 212 * Used as a setting to control the rounding mode used during a 213 * <code>BigDecimal</code> operation. 214 * <p> 215 * If any of the discarded digits are non-zero then the result will 216 * be rounded up (away from zero). 217 */ 218 public static final int ROUND_UP=0; 219 220 221 /* properties shared */ 222 /** 223 * The number of digits (precision) to be used for an operation. 224 * A value of 0 indicates that unlimited precision (as many digits 225 * as are required) will be used. 226 * <p> 227 * The {@link BigDecimal} operator methods use this value to 228 * determine the precision of results. 229 * Note that leading zeros (in the integer part of a number) are 230 * never significant. 231 * <p> 232 * <code>digits</code> will always be non-negative. 233 * 234 * @serial 235 */ 236 int digits; 237 238 /** 239 * The form of results from an operation. 240 * <p> 241 * The {@link BigDecimal} operator methods use this value to 242 * determine the form of results, in particular whether and how 243 * exponential notation should be used. 244 * 245 * @see #ENGINEERING 246 * @see #PLAIN 247 * @see #SCIENTIFIC 248 * @serial 249 */ 250 int form; // values for this must fit in a byte 251 252 /** 253 * Controls whether lost digits checking is enabled for an 254 * operation. 255 * Set to <code>true</code> to enable checking, or 256 * to <code>false</code> to disable checking. 257 * <p> 258 * When enabled, the {@link BigDecimal} operator methods check 259 * the precision of their operand or operands, and throw an 260 * <code>ArithmeticException</code> if an operand is more precise 261 * than the digits setting (that is, digits would be lost). 262 * When disabled, operands are rounded to the specified digits. 263 * 264 * @serial 265 */ 266 boolean lostDigits; 267 268 /** 269 * The rounding algorithm to be used for an operation. 270 * <p> 271 * The {@link BigDecimal} operator methods use this value to 272 * determine the algorithm to be used when non-zero digits have to 273 * be discarded in order to reduce the precision of a result. 274 * The value must be one of the public constants whose name starts 275 * with <code>ROUND_</code>. 276 * 277 * @see #ROUND_CEILING 278 * @see #ROUND_DOWN 279 * @see #ROUND_FLOOR 280 * @see #ROUND_HALF_DOWN 281 * @see #ROUND_HALF_EVEN 282 * @see #ROUND_HALF_UP 283 * @see #ROUND_UNNECESSARY 284 * @see #ROUND_UP 285 * @serial 286 */ 287 int roundingMode; 288 289 /* properties private constant */ 290 // default settings 291 private static final int DEFAULT_FORM=SCIENTIFIC; 292 private static final int DEFAULT_DIGITS=9; 293 private static final boolean DEFAULT_LOSTDIGITS=false; 294 private static final int DEFAULT_ROUNDINGMODE=ROUND_HALF_UP; 295 296 /* properties private constant */ 297 298 private static final int MIN_DIGITS=0; // smallest value for DIGITS. 299 private static final int MAX_DIGITS=999999999; // largest value for DIGITS. If increased, 300 // the BigDecimal class may need update. 301 // list of valid rounding mode values, most common two first 302 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}; 303 304 305 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 306 307 308 309 310 /* properties private constant unused */ 311 312 // Serialization version 313 private static final long serialVersionUID=7163376998892515376L; 314 315 /* properties public constant */ 316 /** 317 * A <code>MathContext</code> object initialized to the default 318 * settings for general-purpose arithmetic. That is, 319 * <code>digits=9 form=SCIENTIFIC lostDigits=false 320 * roundingMode=ROUND_HALF_UP</code>. 321 * 322 * @see #SCIENTIFIC 323 * @see #ROUND_HALF_UP 324 */ 325 public static final android.icu.math.MathContext DEFAULT=new android.icu.math.MathContext(DEFAULT_DIGITS,DEFAULT_FORM,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); 326 327 328 329 330 /* ----- Constructors ----- */ 331 332 /** 333 * Constructs a new <code>MathContext</code> with a specified 334 * precision. 335 * The other settings are set to the default values 336 * (see {@link #DEFAULT}). 337 * 338 * An <code>IllegalArgumentException</code> is thrown if the 339 * <code>setdigits</code> parameter is out of range 340 * (<0 or >999999999). 341 * 342 * @param setdigits The <code>int</code> digits setting 343 * for this <code>MathContext</code>. 344 * @throws IllegalArgumentException parameter out of range. 345 */ 346 347 public MathContext(int setdigits){ 348 this(setdigits,DEFAULT_FORM,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); 349 return;} 350 351 352 /** 353 * Constructs a new <code>MathContext</code> with a specified 354 * precision and form. 355 * The other settings are set to the default values 356 * (see {@link #DEFAULT}). 357 * 358 * An <code>IllegalArgumentException</code> is thrown if the 359 * <code>setdigits</code> parameter is out of range 360 * (<0 or >999999999), or if the value given for the 361 * <code>setform</code> parameter is not one of the appropriate 362 * constants. 363 * 364 * @param setdigits The <code>int</code> digits setting 365 * for this <code>MathContext</code>. 366 * @param setform The <code>int</code> form setting 367 * for this <code>MathContext</code>. 368 * @throws IllegalArgumentException parameter out of range. 369 */ 370 371 public MathContext(int setdigits,int setform){ 372 this(setdigits,setform,DEFAULT_LOSTDIGITS,DEFAULT_ROUNDINGMODE); 373 return;} 374 375 /** 376 * Constructs a new <code>MathContext</code> with a specified 377 * precision, form, and lostDigits setting. 378 * The roundingMode setting is set to its default value 379 * (see {@link #DEFAULT}). 380 * 381 * An <code>IllegalArgumentException</code> is thrown if the 382 * <code>setdigits</code> parameter is out of range 383 * (<0 or >999999999), or if the value given for the 384 * <code>setform</code> parameter is not one of the appropriate 385 * constants. 386 * 387 * @param setdigits The <code>int</code> digits setting 388 * for this <code>MathContext</code>. 389 * @param setform The <code>int</code> form setting 390 * for this <code>MathContext</code>. 391 * @param setlostdigits The <code>boolean</code> lostDigits 392 * setting for this <code>MathContext</code>. 393 * @throws IllegalArgumentException parameter out of range. 394 */ 395 396 public MathContext(int setdigits,int setform,boolean setlostdigits){ 397 this(setdigits,setform,setlostdigits,DEFAULT_ROUNDINGMODE); 398 return;} 399 400 /** 401 * Constructs a new <code>MathContext</code> with a specified 402 * precision, form, lostDigits, and roundingMode setting. 403 * 404 * An <code>IllegalArgumentException</code> is thrown if the 405 * <code>setdigits</code> parameter is out of range 406 * (<0 or >999999999), or if the value given for the 407 * <code>setform</code> or <code>setroundingmode</code> parameters is 408 * not one of the appropriate constants. 409 * 410 * @param setdigits The <code>int</code> digits setting 411 * for this <code>MathContext</code>. 412 * @param setform The <code>int</code> form setting 413 * for this <code>MathContext</code>. 414 * @param setlostdigits The <code>boolean</code> lostDigits 415 * setting for this <code>MathContext</code>. 416 * @param setroundingmode The <code>int</code> roundingMode setting 417 * for this <code>MathContext</code>. 418 * @throws IllegalArgumentException parameter out of range. 419 */ 420 421 public MathContext(int setdigits,int setform,boolean setlostdigits,int setroundingmode){super(); 422 423 424 // set values, after checking 425 if (setdigits!=DEFAULT_DIGITS) 426 { 427 if (setdigits<MIN_DIGITS) 428 throw new java.lang.IllegalArgumentException("Digits too small:"+" "+setdigits); 429 if (setdigits>MAX_DIGITS) 430 throw new java.lang.IllegalArgumentException("Digits too large:"+" "+setdigits); 431 } 432 {/*select*/ 433 if (setform==SCIENTIFIC){ 434 // [most common] 435 }else if (setform==ENGINEERING){ 436 }else if (setform==PLAIN){ 437 }else{ 438 throw new java.lang.IllegalArgumentException("Bad form value:"+" "+setform); 439 } 440 } 441 if ((!(isValidRound(setroundingmode)))) 442 throw new java.lang.IllegalArgumentException("Bad roundingMode value:"+" "+setroundingmode); 443 digits=setdigits; 444 form=setform; 445 lostDigits=setlostdigits; // [no bad value possible] 446 roundingMode=setroundingmode; 447 return;} 448 449 /** 450 * Returns the digits setting. 451 * This value is always non-negative. 452 * 453 * @return an <code>int</code> which is the value of the digits 454 * setting 455 */ 456 457 public int getDigits(){ 458 return digits; 459 } 460 461 /** 462 * Returns the form setting. 463 * This will be one of 464 * {@link #ENGINEERING}, 465 * {@link #PLAIN}, or 466 * {@link #SCIENTIFIC}. 467 * 468 * @return an <code>int</code> which is the value of the form setting 469 */ 470 471 public int getForm(){ 472 return form; 473 } 474 475 /** 476 * Returns the lostDigits setting. 477 * This will be either <code>true</code> (enabled) or 478 * <code>false</code> (disabled). 479 * 480 * @return a <code>boolean</code> which is the value of the lostDigits 481 * setting 482 */ 483 484 public boolean getLostDigits(){ 485 return lostDigits; 486 } 487 488 /** 489 * Returns the roundingMode setting. 490 * This will be one of 491 * {@link #ROUND_CEILING}, 492 * {@link #ROUND_DOWN}, 493 * {@link #ROUND_FLOOR}, 494 * {@link #ROUND_HALF_DOWN}, 495 * {@link #ROUND_HALF_EVEN}, 496 * {@link #ROUND_HALF_UP}, 497 * {@link #ROUND_UNNECESSARY}, or 498 * {@link #ROUND_UP}. 499 * 500 * @return an <code>int</code> which is the value of the roundingMode 501 * setting 502 */ 503 504 public int getRoundingMode(){ 505 return roundingMode; 506 } 507 508 /** Returns the <code>MathContext</code> as a readable string. 509 * The <code>String</code> returned represents the settings of the 510 * <code>MathContext</code> object as four blank-delimited words 511 * separated by a single blank and with no leading or trailing blanks, 512 * as follows: 513 * <ol> 514 * <li> 515 * <code>digits=</code>, immediately followed by 516 * the value of the digits setting as a numeric word. 517 * <li> 518 * <code>form=</code>, immediately followed by 519 * the value of the form setting as an uppercase word 520 * (one of <code>SCIENTIFIC</code>, <code>PLAIN</code>, or 521 * <code>ENGINEERING</code>). 522 * <li> 523 * <code>lostDigits=</code>, immediately followed by 524 * the value of the lostDigits setting 525 * (<code>1</code> if enabled, <code>0</code> if disabled). 526 * <li> 527 * <code>roundingMode=</code>, immediately followed by 528 * the value of the roundingMode setting as a word. 529 * This word will be the same as the name of the corresponding public 530 * constant. 531 * </ol> 532 * <p> 533 * For example: 534 * <br><code> 535 * digits=9 form=SCIENTIFIC lostDigits=0 roundingMode=ROUND_HALF_UP 536 * </code> 537 * <p> 538 * Additional words may be appended to the result of 539 * <code>toString</code> in the future if more properties are added 540 * to the class. 541 * 542 * @return a <code>String</code> representing the context settings. 543 */ 544 545 @Override 546 public java.lang.String toString(){ 547 java.lang.String formstr=null; 548 int r=0; 549 java.lang.String roundword=null; 550 {/*select*/ 551 if (form==SCIENTIFIC) 552 formstr="SCIENTIFIC"; 553 else if (form==ENGINEERING) 554 formstr="ENGINEERING"; 555 else{ 556 formstr="PLAIN";/* form=PLAIN */ 557 } 558 } 559 {int $1=ROUNDS.length;r=0;r:for(;$1>0;$1--,r++){ 560 if (roundingMode==ROUNDS[r]) 561 { 562 roundword=ROUNDWORDS[r]; 563 break r; 564 } 565 } 566 }/*r*/ 567 return "digits="+digits+" "+"form="+formstr+" "+"lostDigits="+(lostDigits?"1":"0")+" "+"roundingMode="+roundword; 568 } 569 570 571 /* <sgml> Test whether round is valid. </sgml> */ 572 // This could be made shared for use by BigDecimal for setScale. 573 574 private static boolean isValidRound(int testround){ 575 int r=0; 576 {int $2=ROUNDS.length;for(r=0;$2>0;$2--,r++){ 577 if (testround==ROUNDS[r]) 578 return true; 579 } 580 }/*r*/ 581 return false; 582 } 583 } 584