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