1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package libcore.java.math; 19 20import java.math.BigDecimal; 21import java.math.BigInteger; 22import java.math.RoundingMode; 23 24public class OldBigDecimalTest extends junit.framework.TestCase { 25 BigInteger value = new BigInteger("12345908"); 26 27 /** 28 * java.math.BigDecimal#BigDecimal(double) 29 */ 30 public void test_ConstructorD() { 31 // 32 // These numbers have an exact representation as doubles: 33 // 34 BigDecimal big = new BigDecimal(123E04); 35 assertTrue( 36 "the BigDecimal value taking a double argument is not initialized properly", 37 big.toString().equals("1230000")); 38 big = new BigDecimal(123.375); 39 assertTrue("init(D) failed for 123.375; became " + big, 40 big.toString().equals("123.375") ); 41 big = new BigDecimal(Math.pow(2, -33)); 42 assertTrue("init(D) failed for 2^(-33) = 1.16415321826934814453125E-10; became " + big, 43 big.toString().equals("1.16415321826934814453125E-10") ); 44 big = new BigDecimal(123456 * Math.pow(2, -33)); 45 assertTrue("init(D) failed for 123456 * 2^(-33) = 0.000014372169971466064453125; became " + big, 46 big.toString().equals("0.000014372169971466064453125") ); 47 big = new BigDecimal(-123456 * Math.pow(2, -33)); 48 assertTrue("init(D) failed for 123456 * 2^(-33) = -0.000014372169971466064453125; became " + big, 49 big.toString().equals("-0.000014372169971466064453125") ); 50 } 51 52 /** 53 * java.math.BigDecimal#BigDecimal(java.lang.String) 54 */ 55 public void test_constructor_String_plus_exp() { 56 /* 57 * BigDecimal does not support a + sign in the exponent when converting 58 * from a String. 59 * 60 * mc 081106: who says so?!? 61 */ 62 BigDecimal bd; 63 bd = new BigDecimal("+23e-0"); 64 assertEquals("incorrect value", "23", bd.toString()); 65 bd = new BigDecimal("-23e+0"); 66 assertEquals("incorrect value", "-23", bd.toString()); 67 } 68 69 /** 70 * java.math.BigDecimal#setScale(int, java.math.RoundingMode) 71 */ 72 public void test_setScaleILjava_math_RoundingMode() { 73 BigDecimal setScale1 = new BigDecimal(2.323E102); 74 BigDecimal setScale2 = setScale1.setScale(4); 75 assertTrue("the number 2.323E102 after setting scale is wrong", 76 setScale2.scale() == 4); 77 assertTrue("the representation of the number 2.323E102 is wrong", 78 setScale2.doubleValue() == 2.323E102); 79 80 setScale1 = new BigDecimal("-1.253E-12"); 81 setScale2 = setScale1.setScale(17, RoundingMode.CEILING); 82 assertTrue("the scale of the number -1.253E-12 after setting scale is wrong", 83 setScale2.scale() == 17); 84 assertTrue( 85 "the representation of the number -1.253E-12 after setting scale is wrong, " + setScale2.toString(), 86 setScale2.toString().equals("-1.25300E-12")); 87 88 // testing rounding Mode RoundingMode.CEILING 89 setScale1 = new BigDecimal(value, 4); 90 setScale2 = setScale1.setScale(1, RoundingMode.CEILING); 91 assertTrue( 92 "the number 1234.5908 after setting scale to 1/RoundingMode.CEILING is wrong", 93 setScale2.toString().equals("1234.6") && setScale2.scale() == 1); 94 BigDecimal setNeg = new BigDecimal(value.negate(), 4); 95 setScale2 = setNeg.setScale(1, RoundingMode.CEILING); 96 assertTrue( 97 "the number -1234.5908 after setting scale to 1/RoundingMode.CEILING is wrong", 98 setScale2.toString().equals("-1234.5") 99 && setScale2.scale() == 1); 100 101 // testing rounding Mode RoundingMode.DOWN 102 setScale2 = setNeg.setScale(1, RoundingMode.DOWN); 103 assertTrue( 104 "the number -1234.5908 after setting scale to 1/RoundingMode.DOWN is wrong", 105 setScale2.toString().equals("-1234.5") 106 && setScale2.scale() == 1); 107 setScale1 = new BigDecimal(value, 4); 108 setScale2 = setScale1.setScale(1, RoundingMode.DOWN); 109 assertTrue( 110 "the number 1234.5908 after setting scale to 1/RoundingMode.DOWN is wrong", 111 setScale2.toString().equals("1234.5") && setScale2.scale() == 1); 112 113 // testing rounding Mode RoundingMode.FLOOR 114 setScale2 = setScale1.setScale(1, RoundingMode.FLOOR); 115 assertTrue( 116 "the number 1234.5908 after setting scale to 1/RoundingMode.FLOOR is wrong", 117 setScale2.toString().equals("1234.5") && setScale2.scale() == 1); 118 setScale2 = setNeg.setScale(1, RoundingMode.FLOOR); 119 assertTrue( 120 "the number -1234.5908 after setting scale to 1/RoundingMode.FLOOR is wrong", 121 setScale2.toString().equals("-1234.6") 122 && setScale2.scale() == 1); 123 124 // testing rounding Mode RoundingMode.HALF_DOWN 125 setScale2 = setScale1.setScale(3, RoundingMode.HALF_DOWN); 126 assertTrue( 127 "the number 1234.5908 after setting scale to 3/RoundingMode.HALF_DOWN is wrong", 128 setScale2.toString().equals("1234.591") 129 && setScale2.scale() == 3); 130 setScale1 = new BigDecimal(new BigInteger("12345000"), 5); 131 setScale2 = setScale1.setScale(1, RoundingMode.HALF_DOWN); 132 assertTrue( 133 "the number 123.45908 after setting scale to 1/RoundingMode.HALF_DOWN is wrong", 134 setScale2.toString().equals("123.4") && setScale2.scale() == 1); 135 setScale2 = new BigDecimal("-1234.5000").setScale(0, 136 RoundingMode.HALF_DOWN); 137 assertTrue( 138 "the number -1234.5908 after setting scale to 0/RoundingMode.HALF_DOWN is wrong", 139 setScale2.toString().equals("-1234") && setScale2.scale() == 0); 140 141 // testing rounding Mode RoundingMode.HALF_EVEN 142 setScale1 = new BigDecimal(1.2345789D); 143 setScale2 = setScale1.setScale(4, RoundingMode.HALF_EVEN); 144 assertTrue( 145 "the number 1.2345789 after setting scale to 4/RoundingMode.HALF_EVEN is wrong", 146 setScale2.doubleValue() == 1.2346D && setScale2.scale() == 4); 147 setNeg = new BigDecimal(-1.2335789D); 148 setScale2 = setNeg.setScale(2, RoundingMode.HALF_EVEN); 149 assertTrue( 150 "the number -1.2335789 after setting scale to 2/RoundingMode.HALF_EVEN is wrong", 151 setScale2.doubleValue() == -1.23D && setScale2.scale() == 2); 152 setScale2 = new BigDecimal("1.2345000").setScale(3, 153 RoundingMode.HALF_EVEN); 154 assertTrue( 155 "the number 1.2345789 after setting scale to 3/RoundingMode.HALF_EVEN is wrong", 156 setScale2.doubleValue() == 1.234D && setScale2.scale() == 3); 157 setScale2 = new BigDecimal("-1.2345000").setScale(3, 158 RoundingMode.HALF_EVEN); 159 assertTrue( 160 "the number -1.2335789 after setting scale to 3/RoundingMode.HALF_EVEN is wrong", 161 setScale2.doubleValue() == -1.234D && setScale2.scale() == 3); 162 163 // testing rounding Mode RoundingMode.HALF_UP 164 setScale1 = new BigDecimal("134567.34650"); 165 setScale2 = setScale1.setScale(3, RoundingMode.HALF_UP); 166 assertTrue( 167 "the number 134567.34658 after setting scale to 3/RoundingMode.HALF_UP is wrong", 168 setScale2.toString().equals("134567.347") 169 && setScale2.scale() == 3); 170 setNeg = new BigDecimal("-1234.4567"); 171 setScale2 = setNeg.setScale(0, RoundingMode.HALF_UP); 172 assertTrue( 173 "the number -1234.4567 after setting scale to 0/RoundingMode.HALF_UP is wrong", 174 setScale2.toString().equals("-1234") && setScale2.scale() == 0); 175 176 // testing rounding Mode RoundingMode.UNNECESSARY 177 try { 178 setScale1.setScale(3, RoundingMode.UNNECESSARY); 179 fail("arithmetic Exception not caught for round unnecessary"); 180 } catch (ArithmeticException e) { 181 } 182 183 // testing rounding Mode RoundingMode.UP 184 setScale1 = new BigDecimal("100000.374"); 185 setScale2 = setScale1.setScale(2, RoundingMode.UP); 186 assertTrue( 187 "the number 100000.374 after setting scale to 2/RoundingMode.UP is wrong", 188 setScale2.toString().equals("100000.38") 189 && setScale2.scale() == 2); 190 setNeg = new BigDecimal(-134.34589D); 191 setScale2 = setNeg.setScale(2, RoundingMode.UP); 192 assertTrue( 193 "the number -134.34589 after setting scale to 2/RoundingMode.UP is wrong", 194 setScale2.doubleValue() == -134.35D && setScale2.scale() == 2); 195 196 // testing invalid rounding modes 197 try { 198 setScale2 = setScale1.setScale(0, -123); 199 fail("IllegalArgumentException is not caught for wrong rounding mode"); 200 } catch (IllegalArgumentException e) { 201 } 202 } 203} 204