1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 }