18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.math.ec;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/**
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Class representing a simple version of a big decimal. A
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <code>SimpleBigDecimal</code> is basically a
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * {@link java.math.BigInteger BigInteger} with a few digits on the right of
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * the decimal point. The number of (binary) digits on the right of the decimal
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * point is called the <code>scale</code> of the <code>SimpleBigDecimal</code>.
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * automatically, but must be set manually. All <code>SimpleBigDecimal</code>s
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * taking part in the same arithmetic operation must have equal scale. The
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * result of a multiplication of two <code>SimpleBigDecimal</code>s returns a
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * <code>SimpleBigDecimal</code> with double scale.
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromclass SimpleBigDecimal
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    //extends Number   // not in J2ME - add compatibility class?
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private static final long serialVersionUID = 1L;
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private final BigInteger bigInt;
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private final int scale;
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * Returns a <code>SimpleBigDecimal</code> representing the same numerical
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * value as <code>value</code>.
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @param value The value of the <code>SimpleBigDecimal</code> to be
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * created.
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @param scale The scale of the <code>SimpleBigDecimal</code> to be
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * created.
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @return The such created <code>SimpleBigDecimal</code>.
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public static SimpleBigDecimal getInstance(BigInteger value, int scale)
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(value.shiftLeft(scale), scale);
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * Constructor for <code>SimpleBigDecimal</code>. The value of the
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * constructed <code>SimpleBigDecimal</code> equals <code>bigInt /
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * 2<sup>scale</sup></code>.
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @param bigInt The <code>bigInt</code> value parameter.
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * @param scale The scale of the constructed <code>SimpleBigDecimal</code>.
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal(BigInteger bigInt, int scale)
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (scale < 0)
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new IllegalArgumentException("scale may not be negative");
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.bigInt = bigInt;
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.scale = scale;
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private void checkScale(SimpleBigDecimal b)
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (scale != b.scale)
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new IllegalArgumentException("Only SimpleBigDecimal of " +
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                "same scale allowed in arithmetic operations");
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal adjustScale(int newScale)
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (newScale < 0)
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new IllegalArgumentException("scale may not be negative");
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (newScale == scale)
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
75d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root            return this;
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.shiftLeft(newScale - scale),
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                newScale);
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal add(SimpleBigDecimal b)
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.add(b.bigInt), scale);
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal add(BigInteger b)
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.add(b.shiftLeft(scale)), scale);
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal negate()
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.negate(), scale);
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal subtract(SimpleBigDecimal b)
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return add(b.negate());
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal subtract(BigInteger b)
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.subtract(b.shiftLeft(scale)),
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                scale);
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal multiply(SimpleBigDecimal b)
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.multiply(b.bigInt), scale + scale);
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal multiply(BigInteger b)
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.multiply(b), scale);
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal divide(SimpleBigDecimal b)
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger dividend = bigInt.shiftLeft(scale);
1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(dividend.divide(b.bigInt), scale);
1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal divide(BigInteger b)
1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.divide(b), scale);
1308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal shiftLeft(int n)
1338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.shiftLeft(n), scale);
1358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int compareTo(SimpleBigDecimal val)
1388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(val);
1408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.compareTo(val.bigInt);
1418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int compareTo(BigInteger val)
1448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.compareTo(val.shiftLeft(scale));
1468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger floor()
1498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.shiftRight(scale);
1518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger round()
1548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        SimpleBigDecimal oneHalf = new SimpleBigDecimal(ECConstants.ONE, 1);
1568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return add(oneHalf.adjustScale(scale)).floor();
1578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int intValue()
1608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return floor().intValue();
1628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public long longValue()
1658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return floor().longValue();
1678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom          /* NON-J2ME compliant.
1698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public double doubleValue()
1708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return Double.valueOf(toString()).doubleValue();
1728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public float floatValue()
1758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return Float.valueOf(toString()).floatValue();
1778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom       */
1798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int getScale()
1808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return scale;
1828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public String toString()
1858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (scale == 0)
1878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
1888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return bigInt.toString();
1898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger floorBigInt = floor();
1928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger fract = bigInt.subtract(floorBigInt.shiftLeft(scale));
1948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (bigInt.signum() == -1)
1958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
1968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fract = ECConstants.ONE.shiftLeft(scale).subtract(fract);
1978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if ((floorBigInt.signum() == -1) && (!(fract.equals(ECConstants.ZERO))))
2008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            floorBigInt = floorBigInt.add(ECConstants.ONE);
2028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String leftOfPoint = floorBigInt.toString();
2048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        char[] fractCharArr = new char[scale];
2068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String fractStr = fract.toString(2);
2078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int fractLen = fractStr.length();
2088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int zeroes = scale - fractLen;
2098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        for (int i = 0; i < zeroes; i++)
2108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fractCharArr[i] = '0';
2128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        for (int j = 0; j < fractLen; j++)
2148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fractCharArr[zeroes + j] = fractStr.charAt(j);
2168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String rightOfPoint = new String(fractCharArr);
2188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        StringBuffer sb = new StringBuffer(leftOfPoint);
2208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        sb.append(".");
2218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        sb.append(rightOfPoint);
2228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return sb.toString();
2248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public boolean equals(Object o)
2278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
2288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (this == o)
2298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return true;
2318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (!(o instanceof SimpleBigDecimal))
2348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return false;
2368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        SimpleBigDecimal other = (SimpleBigDecimal)o;
2398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return ((bigInt.equals(other.bigInt)) && (scale == other.scale));
2408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int hashCode()
2438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
2448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.hashCode() ^ scale;
2458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
248