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 SimpleBigDecimal(SimpleBigDecimal limBigDec)
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        bigInt = limBigDec.bigInt;
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        scale = limBigDec.scale;
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private void checkScale(SimpleBigDecimal b)
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (scale != b.scale)
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new IllegalArgumentException("Only SimpleBigDecimal of " +
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                "same scale allowed in arithmetic operations");
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal adjustScale(int newScale)
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (newScale < 0)
758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            throw new IllegalArgumentException("scale may not be negative");
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (newScale == scale)
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return new SimpleBigDecimal(this);
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.shiftLeft(newScale - scale),
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                newScale);
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal add(SimpleBigDecimal b)
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.add(b.bigInt), scale);
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal add(BigInteger b)
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.add(b.shiftLeft(scale)), scale);
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal negate()
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.negate(), scale);
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal subtract(SimpleBigDecimal b)
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return add(b.negate());
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal subtract(BigInteger b)
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.subtract(b.shiftLeft(scale)),
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                scale);
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal multiply(SimpleBigDecimal b)
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.multiply(b.bigInt), scale + scale);
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal multiply(BigInteger b)
1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.multiply(b), scale);
1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal divide(SimpleBigDecimal b)
1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(b);
1298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger dividend = bigInt.shiftLeft(scale);
1308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(dividend.divide(b.bigInt), scale);
1318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal divide(BigInteger b)
1348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.divide(b), scale);
1368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public SimpleBigDecimal shiftLeft(int n)
1398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new SimpleBigDecimal(bigInt.shiftLeft(n), scale);
1418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int compareTo(SimpleBigDecimal val)
1448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        checkScale(val);
1468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.compareTo(val.bigInt);
1478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int compareTo(BigInteger val)
1508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.compareTo(val.shiftLeft(scale));
1528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger floor()
1558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.shiftRight(scale);
1578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger round()
1608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        SimpleBigDecimal oneHalf = new SimpleBigDecimal(ECConstants.ONE, 1);
1628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return add(oneHalf.adjustScale(scale)).floor();
1638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int intValue()
1668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return floor().intValue();
1688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public long longValue()
1718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return floor().longValue();
1738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom          /* NON-J2ME compliant.
1758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public double doubleValue()
1768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return Double.valueOf(toString()).doubleValue();
1788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public float floatValue()
1818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return Float.valueOf(toString()).floatValue();
1838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom       */
1858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int getScale()
1868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return scale;
1888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public String toString()
1918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (scale == 0)
1938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
1948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return bigInt.toString();
1958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger floorBigInt = floor();
1988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger fract = bigInt.subtract(floorBigInt.shiftLeft(scale));
2008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (bigInt.signum() == -1)
2018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fract = ECConstants.ONE.shiftLeft(scale).subtract(fract);
2038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if ((floorBigInt.signum() == -1) && (!(fract.equals(ECConstants.ZERO))))
2068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            floorBigInt = floorBigInt.add(ECConstants.ONE);
2088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String leftOfPoint = floorBigInt.toString();
2108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        char[] fractCharArr = new char[scale];
2128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String fractStr = fract.toString(2);
2138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int fractLen = fractStr.length();
2148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        int zeroes = scale - fractLen;
2158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        for (int i = 0; i < zeroes; i++)
2168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fractCharArr[i] = '0';
2188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        for (int j = 0; j < fractLen; j++)
2208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            fractCharArr[zeroes + j] = fractStr.charAt(j);
2228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        String rightOfPoint = new String(fractCharArr);
2248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        StringBuffer sb = new StringBuffer(leftOfPoint);
2268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        sb.append(".");
2278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        sb.append(rightOfPoint);
2288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return sb.toString();
2308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public boolean equals(Object o)
2338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
2348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (this == o)
2358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return true;
2378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (!(o instanceof SimpleBigDecimal))
2408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
2418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            return false;
2428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
2438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        SimpleBigDecimal other = (SimpleBigDecimal)o;
2458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return ((bigInt.equals(other.bigInt)) && (scale == other.scale));
2468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public int hashCode()
2498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
2508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return bigInt.hashCode() ^ scale;
2518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
2528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
2538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
254