blob: 6e22c63580e4b197df04731f1006212ef92439d1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.math;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.math.RoundingMode;
import junit.framework.TestCase;
public class OldBigDecimalArithmeticTest extends TestCase {
public void testAddMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("123456789012345.678");
b = new BigDecimal("100000000000000.009");
assertEquals("incorrect value", "123456789012345.67",
a.round(mc).toString());
assertEquals("incorrect value", "100000000000000.00",
b.round(mc).toString());
assertEquals("incorrect value", "223456789012345.67",
a.round(mc).add(b.round(mc)).toString());
res = a.add(b, mc);
assertEquals("incorrect value", "223456789012345.68", res.toString());
mc = new MathContext(33, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("1000000000000000090000000000.0000005");
res = a.add(b, mc);
assertEquals("Incorrect value!", "2234567890123456879012345678.90124", res.toString());
assertEquals("Incorrect scale!", 5, res.scale());
assertEquals("Incorrect precision!", 33, res.precision());
}
public void testSubtractMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567.8");
b = new BigDecimal("10000000000000000.9");
assertEquals("incorrect value", "2345678901234567",
a.round(mc).subtract(b.round(mc)).toString());
res = a.subtract(b, mc);
assertEquals("incorrect value", "2345678901234566.9", res.toString());
assertEquals("Incorrect scale!", 1, res.scale());
assertEquals("Incorrect precision!", 17, res.precision());
mc = new MathContext(33, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("1000000000000000090000000000.0000005");
res = a.subtract(b, mc);
assertEquals("incorrect value", "234567890123456699012345678.901239", res.toString());
assertEquals("Incorrect scale!", 6, res.scale());
assertEquals("Incorrect precision!", 33, res.precision());
}
public void testMultiplyMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("92345678901234567.8");
b = new BigDecimal("10000000000000000.9");
res = a.round(mc).multiply(b.round(mc));
assertEquals("incorrect value", "923456789012345670000000000000000", res.toString());
res = res.round(mc);
assertEquals("incorrect value", "9.2345678901234567E+32", res.toString());
res = a.multiply(b, mc);
assertEquals("incorrect value", "9.2345678901234576E+32", res.toString());
assertEquals("Incorrect scale!", -16, res.scale());
assertEquals("Incorrect precision!", 17, res.precision());
}
public void testPowNonTrivial() {
BigDecimal a, b, res;
a = new BigDecimal("100.9");
try {
res = a.pow(-1);
fail("ArithmeticException is not thrown for negative exponent");
} catch (ArithmeticException e) {
// expected
}
try {
res = a.pow(-103);
fail("ArithmeticException is not thrown for negative exponent");
} catch (ArithmeticException e) {
// expected
}
}
public void testPowMathContext() {
String a = "123121247898748298842980";
int aScale = 10;
int exp = 10;
String c = "8.0044E+130";
int cScale = -126;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
MathContext mc = new MathContext(5, RoundingMode.HALF_UP);
BigDecimal result = aNumber.pow(exp, mc);
assertEquals("incorrect value", c, result.toString());
assertEquals("incorrect scale", cScale, result.scale());
}
public void testPowMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(7, RoundingMode.FLOOR);
a = new BigDecimal("1000000.9");
assertEquals("incorrect value", "1.000000E+6000",
a.round(mc).pow(1000).round(mc).toString());
res = a.pow(1000, mc);
assertEquals("incorrect value", "1.000900E+6000", res.toString());
mc = new MathContext(4, RoundingMode.FLOOR);
a = new BigDecimal("1000.9");
assertEquals("incorrect value", "1.000E+3000",
a.round(mc).pow(1000).round(mc).toString());
res = a.pow(1000, mc);
assertEquals("incorrect value", "2.458E+3000", res.toString());
mc = new MathContext(2, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234");
try {
res = a.pow(-2, mc);
fail("ArithmeticException is not thrown");
} catch (ArithmeticException e) {
// expected
}
a = new BigDecimal("100");
mc = new MathContext(4, RoundingMode.UNNECESSARY);
res = a.pow(-2, mc);
assertEquals("incorrect value", "0.0001", res.toString());
a = new BigDecimal("1000.9");
try {
mc = new MathContext(0, RoundingMode.FLOOR);
res = a.pow(-1, mc);
fail("ArithmeticException is not thrown for negative exponent and precision = 0");
} catch (ArithmeticException e) {
// expected
}
a = new BigDecimal("000.0001");
try {
mc = new MathContext(0, RoundingMode.FLOOR);
res = a.pow(-1, mc);
fail("ArithmeticException is not thrown for negative exponent and precision = 0");
} catch (ArithmeticException e) {
// expected
}
a = new BigDecimal("1E-400");
mc = new MathContext(4, RoundingMode.UNNECESSARY);
res = a.pow(-1, mc);
assertEquals("incorrect value", "1E+400", res.toString());
// Doesn't succeed against JDK of Sun!:
// mc = new MathContext(3, RoundingMode.FLOOR);
// a = new BigDecimal("100.9");
// assertEquals("incorrect value", "1.00E+2000",
// a.round(mc).pow(1000).round(mc).toString());
// res = a.pow(1000).round(mc);
// res = a.pow(1000, mc);
// assertEquals("incorrect value", "7.783E+2003", res.toString());
}
public void testDivideINonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567E1234");
b = new BigDecimal("1.23456789012345679");
assertEquals("incorrect value", "1E+1250",
a.round(mc).divide(b.round(mc)).toString());
res = a.divide(b, BigDecimal.ROUND_FLOOR);
assertEquals("incorrect value", "9.999999999999999E+1249", res.toString());
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("6172839450617283945061728394.5061975");
res = a.divide(b, BigDecimal.ROUND_UNNECESSARY);
assertEquals("incorrect value", "0.2000000", res.toString());
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("1000000000000000090000000000.0000005");
try {
res = a.divide(b, BigDecimal.ROUND_UNNECESSARY);
fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
public void testDivideIINonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567E1234");
b = new BigDecimal("1.23456789012345679");
res = a.divide(b, -1220, BigDecimal.ROUND_FLOOR);
assertEquals("incorrect value", "9.99999999999999927099999343899E+1249", res.toString());
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("6172839450617283945061728394.5061975");
res = a.divide(b, 1, BigDecimal.ROUND_UNNECESSARY);
assertEquals("incorrect value", "0.2", res.toString());
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("6172839450617283945061728394.5061975");
try {
res = a.divide(b, 0, BigDecimal.ROUND_UNNECESSARY);
fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
// Has a rounding problem. seems like the precision is
// 1 too small and cuts off the last digit. also this test might
// not be correct. The name implies that scale should be used.
public void testDivideScaleRoundingModeNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567.1");
b = new BigDecimal("12345678901234567.9");
assertEquals("incorrect value", "1",
a.round(mc).divide(b.round(mc)).toString());
res = a.divide(b, mc);
assertEquals("incorrect value", "0.99999999999999993", res.toString());
mc = new MathContext(13, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("6172839450617283945061728394.5061975");
res = a.divide(b, mc);
assertEquals("incorrect value", "0.2", res.toString());
mc = new MathContext(33, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("1000000000000000090000000000.0000005");
try {
res = a.divide(b, mc);
fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
// The same test and the same problem like testDivideScaleRoundingModeNonTrivial.
public void testDivideMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
// FAILS AGAINST RI!:
// mc = new MathContext(6, RoundingMode.FLOOR);
// a = new BigDecimal("12345.1");
// b = new BigDecimal("12345.9");
// assertEquals("incorrect value", "1",
// a.round(mc).divide(b.round(mc)).toString());
// res = a.divide(b, mc);
// assertEquals("incorrect value", "0.99993", res.toString());
mc = new MathContext(5, RoundingMode.FLOOR);
a = new BigDecimal("12345.1");
b = new BigDecimal("12345.9");
assertEquals("incorrect value", "1",
a.round(mc).divide(b.round(mc)).toString());
res = a.divide(b, mc);
assertEquals("incorrect value", "0.99993", res.toString());
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567.1");
b = new BigDecimal("12345678901234567.9");
assertEquals("incorrect value", "1",
a.round(mc).divide(b.round(mc)).toString());
res = a.divide(b, mc);
assertEquals("incorrect value", "0.99999999999999993", res.toString());
assertEquals("incorrect value", res.round(mc).toString(), res.toString());
mc = new MathContext(13, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("6172839450617283945061728394.5061975");
res = a.divide(b, mc);
assertEquals("incorrect value", "0.2", res.toString());
mc = new MathContext(33, RoundingMode.UNNECESSARY);
a = new BigDecimal("1234567890123456789012345678.9012395");
b = new BigDecimal("1000000000000000090000000000.0000005");
try {
res = a.divide(b, mc);
fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
public void testDivideToIntegralValueByZero() {
String a = "3736186567876876578956958765675671119238118911893939591735";
int aScale = 45;
String b = "0";
int bScale = -70;
String res = "277923185514690367474770683";
int resScale = 0;
String rem = "1.3032693871288309587558885943391070087960319452465789990E-15";
int remScale = 70;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
try {
BigDecimal result = aNumber.divideToIntegralValue(bNumber);
fail("ArithmeticException not thrown for division by 0");
} catch (ArithmeticException e) {
// expected
}
}
public void testDivideToIntegralValueMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
a = new BigDecimal("92345678901234567.8");
b = new BigDecimal("43");
res = a.multiply(b);
assertEquals("incorrect value", "3970864192753086415.4", res.toString());
mc = new MathContext(20, RoundingMode.DOWN);
a = new BigDecimal("3970864192753086415.4");
b = new BigDecimal("92345678901234567.8");
b = new BigDecimal("92345678901234567.8001");
assertEquals("incorrect value", "43",
a.round(mc).divideToIntegralValue(b.round(mc)).toString());
res = a.divideToIntegralValue(b, mc);
assertEquals("incorrect value", "42", res.toString());
// mc = new MathContext(1, RoundingMode.DOWN);
// res = a.divideToIntegralValue(b, mc);
// assertEquals("incorrect value", "42", res.toString());
mc = new MathContext(17, RoundingMode.FLOOR);
a = new BigDecimal("518518513851851830");
b = new BigDecimal("12345678901234567.9");
assertEquals("incorrect value", "42",
a.round(mc).divideToIntegralValue(b.round(mc)).toString());
res = a.divideToIntegralValue(b, mc);
assertEquals("incorrect value", "41", res.toString());
}
/**
* divideAndRemainder(BigDecimal)
*/
public void testDivideAndRemainderByZero() {
String a = "3736186567876876578956958765675671119238118911893939591735";
int aScale = 45;
String b = "0";
int bScale = -70;
String res = "277923185514690367474770683";
int resScale = 0;
String rem = "1.3032693871288309587558885943391070087960319452465789990E-15";
int remScale = 70;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
try {
BigDecimal result[] = aNumber.divideAndRemainder(bNumber);
fail("ArithmeticException not thrown for division by 0");
} catch (ArithmeticException e) {
// expected
}
}
public void testDivideAndRemainderMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res[];
mc = new MathContext(13, RoundingMode.FLOOR);
a = new BigDecimal("12345678901234567.1");
b = new BigDecimal("12345678901234567.9");
assertEquals("incorrect value", "0E+4",
a.round(mc).divideAndRemainder(b.round(mc))[1].toString());
res = a.divideAndRemainder(b, mc);
assertEquals("incorrect value", "12345678901234567.1", res[1].toString());
mc = new MathContext(1, RoundingMode.UNNECESSARY);
a = new BigDecimal("6172839450617283945061728394.5061976");
b = new BigDecimal("1234567890123456789012345678.9012395");
res = a.divideAndRemainder(b, mc);
assertEquals("incorrect value", "1E-7", res[1].toString());
mc = new MathContext(3, RoundingMode.UNNECESSARY);
a = new BigDecimal("6172839450617283945061728394.6000000");
b = new BigDecimal("1234567890123456789012345678.9012395");
try {
res = a.divideAndRemainder(b, mc);
assertEquals("incorrect value", "0.0938025", res[1].toString());
assertEquals("incorrect value", "0.09", res[1].round(mc).toString());
// fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
public void testRemainderByZero() {
String a = "3736186567876876578956958765675671119238118911893939591735";
int aScale = 45;
String b = "0";
int bScale = -70;
String res = "277923185514690367474770683";
int resScale = 0;
String rem = "1.3032693871288309587558885943391070087960319452465789990E-15";
int remScale = 70;
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
try {
BigDecimal result = aNumber.remainder(bNumber);
fail("ArithmeticException not thrown for division by 0");
} catch (ArithmeticException e) {
// expected
}
}
public void testRemainderMathContextNonTrivial() {
MathContext mc;
BigDecimal a, b, res;
mc = new MathContext(13, RoundingMode.DOWN);
a = new BigDecimal("12345678901234567.1");
b = new BigDecimal("12345678901234567.9");
assertEquals("incorrect value", "0E+4",
a.round(mc).divideAndRemainder(b.round(mc))[1].toString());
res = a.remainder(b, mc);
assertEquals("incorrect value", "12345678901234567.1", res.toString());
mc = new MathContext(1, RoundingMode.UNNECESSARY);
a = new BigDecimal("6172839450617283945061728394.5061976");
b = new BigDecimal("1234567890123456789012345678.9012395");
res = a.remainder(b, mc);
assertEquals("incorrect value", "1E-7", res.toString());
mc = new MathContext(3, RoundingMode.UNNECESSARY);
a = new BigDecimal("6172839450617283945061728394.6000000");
b = new BigDecimal("1234567890123456789012345678.9012395");
try {
res = a.remainder(b, mc);
assertEquals("incorrect value", "0.0938025", res.toString());
assertEquals("incorrect value", "0.09", res.round(mc).toString());
// fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
}
public void testRoundNonTrivial() {
MathContext mc;
String biStr = new String( "12345678901234567890123456789012345.0E+10");
String nbiStr = new String("-12345678901234567890123456789012345.E+10");
BigDecimal bd;
mc = new MathContext(17, RoundingMode.FLOOR);
bd = new BigDecimal(new BigInteger("123456789012345678"), 3, mc);
assertEquals("incorrect value", "123456789012345.67", bd.toString());
mc = new MathContext(31, RoundingMode.UP);
bd = (new BigDecimal(biStr)).round(mc);
assertEquals("incorrect value", "1.234567890123456789012345678902E+44", bd.toString());
bd = (new BigDecimal(nbiStr)).round(mc);
assertEquals("incorrect value", "-1.234567890123456789012345678902E+44", bd.toString());
mc = new MathContext(28, RoundingMode.DOWN);
bd = (new BigDecimal(biStr)).round(mc);
assertEquals("incorrect value", "1.234567890123456789012345678E+44", bd.toString());
bd = (new BigDecimal(nbiStr)).round(mc);
assertEquals("incorrect value", "-1.234567890123456789012345678E+44", bd.toString());
mc = new MathContext(33, RoundingMode.CEILING);
bd = (new BigDecimal(biStr)).round(mc);
assertEquals("incorrect value", "1.23456789012345678901234567890124E+44", bd.toString());
bd = (new BigDecimal(nbiStr)).round(mc);
assertEquals("incorrect value", "-1.23456789012345678901234567890123E+44", bd.toString());
mc = new MathContext(34, RoundingMode.UNNECESSARY);
try {
bd = (new BigDecimal(biStr)).round(mc);
fail("No ArithmeticException for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
try {
bd = (new BigDecimal(nbiStr)).round(mc);
fail("No ArithmeticException for RoundingMode.UNNECESSARY");
} catch (ArithmeticException e) {
// expected
}
mc = new MathContext(7, RoundingMode.FLOOR);
bd = new BigDecimal("1000000.9", mc);
assertEquals("incorrect value", "1000000", bd.toString());
}
/**
* @tests java.math.BigDecimal#add(java.math.BigDecimal)
*/
public void test_addBigDecimal() {
BigDecimal add1 = new BigDecimal("23.456");
BigDecimal add2 = new BigDecimal("3849.235");
BigDecimal sum = add1.add(add2);
assertTrue("the sum of 23.456 + 3849.235 is wrong", sum.unscaledValue().toString().equals(
"3872691")
&& sum.scale() == 3);
assertTrue("the sum of 23.456 + 3849.235 is not printed correctly", sum.toString().equals(
"3872.691"));
BigDecimal add3 = new BigDecimal(12.34E02D);
assertTrue("the sum of 23.456 + 12.34E02 is not printed correctly", (add1.add(add3))
.toString().equals("1257.456"));
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.MathContext) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeUP() {
String a = "-37361671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.UP;
String c = "-1";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeDOWN() {
String a = "-37361671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.DOWN;
String c = "0";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeCEILING() {
String a = "3736186567876876578956958765675671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.CEILING;
String c = "50000260373164286401361914";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeFLOOR() {
String a = "3736186567876876578956958765675671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.FLOOR;
String c = "50000260373164286401361913";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeHALF_UP() {
String a = "3736186567876876578956958765675671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.HALF_UP;
String c = "50000260373164286401361913";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeHALF_DOWN() {
String a = "3736186567876876578956958765675671119238118911893939591735";
int aScale = 5;
String b = "74723342238476237823787879183470";
int bScale = 15;
int newScale = 7;
RoundingMode rm = RoundingMode.HALF_DOWN;
String c = "500002603731642864013619132621009722.1803810";
BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
BigDecimal result = aNumber.divide(bNumber, newScale, rm);
assertEquals("incorrect value", c, result.toString());
assertEquals("incorrect scale", newScale, result.scale());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingModeHALF_EVEN() {
String a = "3736186567876876578956958765675671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.HALF_EVEN;
String c = "50000260373164286401361913";
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
BigDecimal result = aNumber.divide(bNumber, rm);
assertEquals("incorrect value", c, result.toString());
}
/**
* @tests java.math.BigDecimal#divide(java.math.BigDecimal,
* java.math.RoundingMode) divide(BigDecimal, RoundingMode)
*/
public void test_DivideBigDecimalRoundingExc() {
String a = "3736186567876876578956958765675671119238118911893939591735";
String b = "74723342238476237823787879183470";
RoundingMode rm = RoundingMode.UNNECESSARY;
BigDecimal aNumber = new BigDecimal(new BigInteger(a));
BigDecimal bNumber = new BigDecimal(new BigInteger(b));
try {
aNumber.divide(bNumber, rm);
fail("ArithmeticException is not thrown for RoundingMode.UNNECESSARY divider");
} catch (java.lang.ArithmeticException ae) {
// expected
}
try {
bNumber = new BigDecimal(0);
aNumber.divide(bNumber, rm);
fail("ArithmeticException is not thrown for zero divider");
} catch (java.lang.ArithmeticException ae) {
// expected
}
}
}