View Javadoc

1   /*
2    * Copyright (c) 2001, Zoltan Farkas All Rights Reserved.
3    *
4    * This library is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Lesser General Public
6    * License as published by the Free Software Foundation; either
7    * version 2.1 of the License, or (at your option) any later version.
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU Lesser General Public
15   * License along with this program; if not, write to the Free Software
16   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17   */
18  package net.sf.zel.nr;
19  
20  import java.math.BigDecimal;
21  import java.math.BigInteger;
22  import javax.annotation.concurrent.Immutable;
23  import net.sf.zel.nr.ExtendedNumber.Type;
24  import net.sf.zel.math.ExtendedMathContext;
25  
26  @Immutable
27  public final class OperableBigDecimal extends OperableNumber
28  {
29      private static final long serialVersionUID = -1790422919528652103L;
30  
31      public static final OperableBigDecimal ZERO = new OperableBigDecimal(BigDecimal.ZERO);
32      public static final OperableBigDecimal ONE = new OperableBigDecimal(BigDecimal.ONE);
33  
34      private final BigDecimal number;
35  
36      public OperableBigDecimal(final BigDecimal n)
37      {
38          number = n;
39      }
40  
41      public OperableBigDecimal(final String str)
42      {
43          number = new BigDecimal(str, ExtendedMathContext.CURRENT_EXTENDED_MATH_CONTEXT.get().getMathContext());
44      }
45  
46      @Override
47      public OperableNumber zero()
48      {
49          return ZERO;
50      }
51  
52      @Override
53      public OperableNumber add(OperableNumber addend)
54      {
55          return new OperableBigDecimal(number.add(addend.bigDecimalValue(),
56                  ExtendedMathContext.CURRENT_EXTENDED_MATH_CONTEXT.get().getMathContext() ));
57      }
58  
59      @Override
60      public OperableNumber subtract(OperableNumber subtrahend)
61      {
62          return new OperableBigDecimal(number.subtract(subtrahend.bigDecimalValue(),
63                  ExtendedMathContext.CURRENT_EXTENDED_MATH_CONTEXT.get().getMathContext() ));
64      }
65  
66  
67      @Override
68      public OperableNumber multiply(OperableNumber multiplier)
69      {
70          return new OperableBigDecimal(number.multiply(multiplier.bigDecimalValue(),
71                  ExtendedMathContext.CURRENT_EXTENDED_MATH_CONTEXT.get().getMathContext()) );
72      }
73  
74      @Override
75      public OperableNumber divide(OperableNumber divisor)
76      {
77          return new OperableBigDecimal(number.divide(divisor.bigDecimalValue(),
78                  ExtendedMathContext.CURRENT_EXTENDED_MATH_CONTEXT.get().getMathContext()) );
79      }
80  
81  
82      @Override
83      public OperableNumber mod(OperableNumber divisor)
84      {
85           throw new UnsupportedOperationException("mod on bigdecimals does not make sense");
86      }
87  
88      @Override
89      public BigDecimal bigDecimalValue()
90      {
91          return number;
92      }
93  
94      @Override
95      public BigInteger bigIntegerValue()
96      {
97          return number.toBigInteger();
98      }
99  
100     public int compareTo(OperableNumber o)
101     {
102         return number.compareTo(o.bigDecimalValue());
103     }
104 
105     @Override
106     public Type getType()
107     {
108         return Type.REAL;
109     }
110 
111     @Override
112     public OperableGNUBigInteger gnuBigIntegerValue() {
113         return new OperableGNUBigInteger(number.toString());
114     }
115 
116     @Override
117     public int intValue()
118     {
119         return number.intValue();
120     }
121 
122     @Override
123     public long longValue()
124     {
125         return number.longValue();
126     }
127 
128     @Override
129     public float floatValue()
130     {
131         return number.floatValue();
132     }
133 
134     @Override
135     public double doubleValue()
136     {
137         return number.doubleValue();
138     }
139 
140     @Override
141     public int compareTo(Object o)
142     {
143         return number.compareTo(((OperableNumber)o).bigDecimalValue());
144     }
145 
146     @Override
147     public String toString()
148     {
149         return number.toPlainString();
150     }
151 
152     @Override
153     public boolean equals(Object obj)
154     {
155         if (obj == null)
156         {
157             return false;
158         }
159         if (getClass() != obj.getClass())
160         {
161             return false;
162         }
163         final OperableBigDecimal other = (OperableBigDecimal) obj;
164         if (this.number != other.number && (this.number == null || !this.number.equals(other.number)))
165         {
166             return false;
167         }
168         return true;
169     }
170 
171     @Override
172     public int hashCode()
173     {
174         return number.hashCode();
175     }
176 
177     @Override
178     public OperableGNUBigFloat gnuBigFloatValue()
179     {
180         return new OperableGNUBigFloat(number.toString());
181     }
182 
183     @Override
184     public int getPrecision()
185     {
186         return number.precision();
187     }
188 
189     @Override
190     public OperableNumber create(final String val)
191     {
192         if ("0.0".equals(val))
193             return ZERO;
194         else
195             return new OperableBigDecimal(val);
196     }
197 
198     @Override
199     public ExtendedNumber one()
200     {
201         return ONE;
202     }
203 
204     @Override
205     public OperableNumber convert(ExtendedNumber val)
206     {
207         return new OperableBigDecimal(val.bigDecimalValue());
208     }
209 
210 }