1 module java.math.BigDecimal; 2 3 import java.lang.all; 4 import java.math.BigInteger; 5 6 class BigDecimal : Number { 7 static int ROUND_CEILING; 8 static int ROUND_DOWN; 9 static int ROUND_FLOOR; 10 static int ROUND_HALF_DOWN; 11 static int ROUND_HALF_EVEN; 12 static int ROUND_HALF_UP; 13 static int ROUND_UNNECESSARY; 14 static int ROUND_UP; 15 16 private BigInteger intVal; 17 private int scale_; 18 private int intCompact; 19 private int precision; 20 private static const MAX_BIGINT_BITS = 62; 21 22 this(BigInteger val){ 23 implMissing(__FILE__, __LINE__); 24 } 25 this(BigInteger unscaledVal, int scale_){ 26 this.intVal = unscaledVal; 27 this.scale_ = scale_; 28 } 29 this(double val){ 30 if (double.nan is val || double.infinity is val ) 31 throw new NumberFormatException("Infinite or NaN"); 32 33 // Translate the double into sign, exponent and significand, according 34 // to the formulae in JLS, Section 20.10.22. 35 long valBits = *cast(long*) & val; 36 int sign = ((valBits >> 63)==0 ? 1 : -1); 37 int exponent = cast(int) ((valBits >> 52) & 0x7ffL); 38 long significand = (exponent==0 ? (valBits & ((1L<<52) - 1)) << 1 39 : (valBits & ((1L<<52) - 1)) | (1L<<52)); 40 exponent -= 1075; 41 // At this point, val == sign * significand * 2**exponent. 42 43 /* 44 * Special case zero to supress nonterminating normalization 45 * and bogus scale calculation. 46 */ 47 if (significand == 0) { 48 intVal = cast(BigInteger) BigInteger.ZERO; 49 intCompact = 0; 50 precision = 1; 51 return; 52 } 53 54 // Normalize 55 while((significand & 1) == 0) { // i.e., significand is even 56 significand >>= 1; 57 exponent++; 58 } 59 60 // Calculate intVal and scale 61 intVal = BigInteger.valueOf(sign*significand); 62 if (exponent < 0) { 63 intVal = intVal.multiply(BigInteger.valueOf(5).pow(-exponent)); 64 scale_ = -exponent; 65 } else if (exponent > 0) { 66 intVal = intVal.multiply(BigInteger.valueOf(2).pow(exponent)); 67 } 68 if (intVal.bitLength() <= MAX_BIGINT_BITS) { 69 intCompact = cast(int)intVal.longValue(); 70 } 71 } 72 this(String val){ 73 implMissing(__FILE__, __LINE__); 74 } 75 BigDecimal abs(){ 76 implMissing(__FILE__, __LINE__); 77 return null; 78 } 79 BigDecimal add(BigDecimal val){ 80 implMissing(__FILE__, __LINE__); 81 return null; 82 } 83 int compareTo(BigDecimal val){ 84 implMissing(__FILE__, __LINE__); 85 return 0; 86 } 87 int compareTo(Object o){ 88 implMissing(__FILE__, __LINE__); 89 return 0; 90 } 91 BigDecimal divide(BigDecimal val, int roundingMode){ 92 implMissing(__FILE__, __LINE__); 93 return null; 94 } 95 BigDecimal divide(BigDecimal val, int scale_, int roundingMode){ 96 implMissing(__FILE__, __LINE__); 97 return null; 98 } 99 override 100 double doubleValue(){ 101 implMissing(__FILE__, __LINE__); 102 return 0; 103 } 104 bool equals(Object x){ 105 implMissing(__FILE__, __LINE__); 106 return 0; 107 } 108 override 109 float floatValue(){ 110 implMissing(__FILE__, __LINE__); 111 return 0; 112 } 113 int hashCode(){ 114 implMissing(__FILE__, __LINE__); 115 return 0; 116 } 117 override 118 int intValue(){ 119 implMissing(__FILE__, __LINE__); 120 return 0; 121 } 122 override 123 long longValue(){ 124 implMissing(__FILE__, __LINE__); 125 return 0; 126 } 127 BigDecimal max(BigDecimal val){ 128 implMissing(__FILE__, __LINE__); 129 return null; 130 } 131 BigDecimal min(BigDecimal val){ 132 implMissing(__FILE__, __LINE__); 133 return null; 134 } 135 BigDecimal movePointLeft(int n){ 136 implMissing(__FILE__, __LINE__); 137 return null; 138 } 139 BigDecimal movePointRight(int n){ 140 implMissing(__FILE__, __LINE__); 141 return null; 142 } 143 BigDecimal multiply(BigDecimal val){ 144 implMissing(__FILE__, __LINE__); 145 return null; 146 } 147 BigDecimal negate(){ 148 implMissing(__FILE__, __LINE__); 149 return null; 150 } 151 int scale(){ 152 implMissing(__FILE__, __LINE__); 153 return this.scale_; 154 } 155 BigDecimal setScale(int scale_){ 156 implMissing(__FILE__, __LINE__); 157 return null; 158 } 159 BigDecimal setScale(int scale_, int roundingMode){ 160 implMissing(__FILE__, __LINE__); 161 return null; 162 } 163 int signum(){ 164 implMissing(__FILE__, __LINE__); 165 return 0; 166 } 167 BigDecimal subtract(BigDecimal val){ 168 implMissing(__FILE__, __LINE__); 169 return null; 170 } 171 BigInteger toBigInteger(){ 172 implMissing(__FILE__, __LINE__); 173 return null; 174 } 175 override 176 String toString(){ 177 implMissing(__FILE__, __LINE__); 178 return null; 179 } 180 BigInteger unscaledValue(){ 181 implMissing(__FILE__, __LINE__); 182 return null; 183 } 184 static BigDecimal valueOf(long val){ 185 implMissing(__FILE__, __LINE__); 186 return null; 187 } 188 static BigDecimal valueOf(long unscaledVal, int scale_){ 189 implMissing(__FILE__, __LINE__); 190 return null; 191 } 192 } 193