| /* |
| * 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 |
| } |
| } |
| } |