home *** CD-ROM | disk | FTP | other *** search
- package java.math;
-
- public class BigDecimal extends Number {
- private BigInteger intVal;
- private int scale;
- public static final int ROUND_UP = 0;
- public static final int ROUND_DOWN = 1;
- public static final int ROUND_CEILING = 2;
- public static final int ROUND_FLOOR = 3;
- public static final int ROUND_HALF_UP = 4;
- public static final int ROUND_HALF_DOWN = 5;
- public static final int ROUND_HALF_EVEN = 6;
- public static final int ROUND_UNNECESSARY = 7;
-
- public BigDecimal(String var1) throws NumberFormatException {
- int var2 = var1.indexOf(46);
- if (var2 == -1) {
- this.intVal = new BigInteger(var1);
- } else if (var2 == var1.length() - 1) {
- this.intVal = new BigInteger(var1.substring(0, var1.length() - 1));
- } else {
- String var3 = var1.substring(var2 + 1);
- this.scale = var3.length();
- BigInteger var4 = new BigInteger(var3);
- if (var4.signum() < 0) {
- throw new NumberFormatException();
- } else if (var2 == 0) {
- this.intVal = var4;
- } else if (var1.charAt(0) == '-' && var2 == 1) {
- this.intVal = var4.negate();
- } else {
- String var5 = var1.substring(0, var2);
- BigInteger var6 = new BigInteger(var5);
- if (var1.charAt(0) == '-') {
- var4 = var4.negate();
- }
-
- this.intVal = timesTenToThe(var6, this.scale).add(var4);
- }
- }
- }
-
- public BigDecimal(double var1) throws NumberFormatException {
- if (!Double.isInfinite(var1) && !Double.isNaN(var1)) {
- long var3 = Double.doubleToLongBits(var1);
- int var5 = var3 >> 63 == 0L ? 1 : -1;
- int var6 = (int)(var3 >> 52 & 2047L);
- long var7 = var6 == 0 ? (var3 & (1L << 52) - 1L) << 1 : var3 & (1L << 52) - 1L | 1L << 52;
- var6 -= 1075;
- if (var7 == 0L) {
- this.intVal = BigInteger.valueOf(0L);
- } else {
- while((var7 & 1L) == 0L) {
- var7 >>= 1;
- ++var6;
- }
-
- this.intVal = BigInteger.valueOf((long)var5 * var7);
- if (var6 < 0) {
- this.intVal = this.intVal.multiply(BigInteger.valueOf(5L).pow(-var6));
- this.scale = -var6;
- } else {
- if (var6 > 0) {
- this.intVal = this.intVal.multiply(BigInteger.valueOf(2L).pow(var6));
- }
-
- }
- }
- } else {
- throw new NumberFormatException("Infinite or NaN");
- }
- }
-
- public BigDecimal(BigInteger var1) {
- this.intVal = var1;
- }
-
- public BigDecimal(BigInteger var1, int var2) throws NumberFormatException {
- if (var2 < 0) {
- throw new NumberFormatException("Negative scale");
- } else {
- this.intVal = var1;
- this.scale = var2;
- }
- }
-
- public static BigDecimal valueOf(long var0, int var2) throws NumberFormatException {
- return new BigDecimal(BigInteger.valueOf(var0), var2);
- }
-
- public static BigDecimal valueOf(long var0) {
- return valueOf(var0, 0);
- }
-
- public BigDecimal add(BigDecimal var1) {
- BigDecimal[] var2 = new BigDecimal[]{this, var1};
- matchScale(var2);
- return new BigDecimal(var2[0].intVal.add(var2[1].intVal), var2[0].scale);
- }
-
- public BigDecimal subtract(BigDecimal var1) {
- BigDecimal[] var2 = new BigDecimal[]{this, var1};
- matchScale(var2);
- return new BigDecimal(var2[0].intVal.subtract(var2[1].intVal), var2[0].scale);
- }
-
- public BigDecimal multiply(BigDecimal var1) {
- return new BigDecimal(this.intVal.multiply(var1.intVal), this.scale + var1.scale);
- }
-
- public BigDecimal divide(BigDecimal var1, int var2, int var3) throws ArithmeticException, IllegalArgumentException {
- if (var2 < 0) {
- throw new ArithmeticException("Negative scale");
- } else if (var3 >= 0 && var3 <= 7) {
- BigDecimal var4;
- BigDecimal var5;
- if (var2 + var1.scale >= this.scale) {
- var4 = this.setScale(var2 + var1.scale);
- var5 = var1;
- } else {
- var4 = this;
- var5 = var1.setScale(this.scale - var2);
- }
-
- BigInteger[] var6 = var4.intVal.divideAndRemainder(var5.intVal);
- BigInteger var7 = var6[0];
- BigInteger var8 = var6[1];
- if (var8.signum() == 0) {
- return new BigDecimal(var7, var2);
- } else if (var3 == 7) {
- throw new ArithmeticException("Rounding necessary");
- } else {
- int var9 = var4.signum() * var5.signum();
- boolean var10;
- if (var3 == 0) {
- var10 = true;
- } else if (var3 == 1) {
- var10 = false;
- } else if (var3 == 2) {
- var10 = var9 > 0;
- } else if (var3 == 3) {
- var10 = var9 < 0;
- } else {
- int var11 = var8.abs().multiply(BigInteger.valueOf(2L)).compareTo(var5.intVal.abs());
- if (var11 < 0) {
- var10 = false;
- } else if (var11 > 0) {
- var10 = true;
- } else if (var3 == 4) {
- var10 = true;
- } else if (var3 == 5) {
- var10 = false;
- } else {
- var10 = var7.testBit(0);
- }
- }
-
- return var10 ? new BigDecimal(var7.add(BigInteger.valueOf((long)var9)), var2) : new BigDecimal(var7, var2);
- }
- } else {
- throw new IllegalArgumentException("Invalid rounding mode");
- }
- }
-
- public BigDecimal divide(BigDecimal var1, int var2) throws ArithmeticException, IllegalArgumentException {
- return this.divide(var1, this.scale, var2);
- }
-
- public BigDecimal abs() {
- return this.signum() < 0 ? this.negate() : this;
- }
-
- public BigDecimal negate() {
- return new BigDecimal(this.intVal.negate(), this.scale);
- }
-
- public int signum() {
- return this.intVal.signum();
- }
-
- public int scale() {
- return this.scale;
- }
-
- public BigDecimal setScale(int var1, int var2) throws ArithmeticException, IllegalArgumentException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative scale");
- } else if (var2 >= 0 && var2 <= 7) {
- if (var1 == this.scale) {
- return this;
- } else {
- return var1 > this.scale ? new BigDecimal(timesTenToThe(this.intVal, var1 - this.scale), var1) : this.divide(valueOf(1L), var1, var2);
- }
- } else {
- throw new IllegalArgumentException("Invalid rounding mode");
- }
- }
-
- public BigDecimal setScale(int var1) throws ArithmeticException, IllegalArgumentException {
- return this.setScale(var1, 7);
- }
-
- public BigDecimal movePointLeft(int var1) {
- return var1 >= 0 ? new BigDecimal(this.intVal, this.scale + var1) : this.movePointRight(-var1);
- }
-
- public BigDecimal movePointRight(int var1) {
- return this.scale >= var1 ? new BigDecimal(this.intVal, this.scale - var1) : new BigDecimal(timesTenToThe(this.intVal, var1 - this.scale), 0);
- }
-
- public int compareTo(BigDecimal var1) {
- int var2 = this.signum() - var1.signum();
- if (var2 != 0) {
- return var2 > 0 ? 1 : -1;
- } else {
- BigDecimal[] var3 = new BigDecimal[]{this, var1};
- matchScale(var3);
- return var3[0].intVal.compareTo(var3[1].intVal);
- }
- }
-
- public boolean equals(Object var1) {
- if (!(var1 instanceof BigDecimal)) {
- return false;
- } else {
- BigDecimal var2 = (BigDecimal)var1;
- return this.scale == var2.scale && this.intVal.equals(var2.intVal);
- }
- }
-
- public BigDecimal min(BigDecimal var1) {
- return this.compareTo(var1) < 0 ? this : var1;
- }
-
- public BigDecimal max(BigDecimal var1) {
- return this.compareTo(var1) > 0 ? this : var1;
- }
-
- public int hashCode() {
- return 37 * this.intVal.hashCode() + this.scale;
- }
-
- public String toString() {
- if (this.scale == 0) {
- return this.intVal.toString();
- } else {
- String var2 = this.intVal.abs().toString();
- int var3 = this.signum();
- int var4 = var2.length() - this.scale;
- if (var4 == 0) {
- return (var3 < 0 ? "-0." : "0.") + var2;
- } else {
- StringBuffer var1;
- if (var4 > 0) {
- var1 = new StringBuffer(var2);
- var1.insert(var4, '.');
- if (var3 < 0) {
- var1.insert(0, '-');
- }
- } else {
- var1 = new StringBuffer(3 - var4 + var2.length());
- var1.append(var3 < 0 ? "-0." : "0.");
-
- for(int var5 = 0; var5 < -var4; ++var5) {
- var1.append('0');
- }
-
- var1.append(var2);
- }
-
- return var1.toString();
- }
- }
- }
-
- public BigInteger toBigInteger() {
- return this.scale == 0 ? this.intVal : this.intVal.divide(BigInteger.valueOf(10L).pow(this.scale));
- }
-
- public int intValue() {
- return this.toBigInteger().intValue();
- }
-
- public long longValue() {
- return this.toBigInteger().longValue();
- }
-
- public float floatValue() {
- return Float.valueOf(this.toString());
- }
-
- public double doubleValue() {
- return Double.valueOf(this.toString());
- }
-
- private static BigInteger timesTenToThe(BigInteger var0, int var1) {
- return var0.multiply(BigInteger.valueOf(10L).pow(var1));
- }
-
- private static void matchScale(BigDecimal[] var0) {
- if (var0[0].scale < var0[1].scale) {
- var0[0] = var0[0].setScale(var0[1].scale);
- } else {
- if (var0[1].scale < var0[0].scale) {
- var0[1] = var0[1].setScale(var0[0].scale);
- }
-
- }
- }
- }
-