public void MultiplyBigDecimal()
        {
            BigDecimal multi1 = new BigDecimal(value, 5);
            BigDecimal multi2 = new BigDecimal(2.345D);
            BigDecimal result = multi1.Multiply(multi2);

            Assert.IsTrue(result.ToString().StartsWith("289.51154260") && result.Scale == multi1.Scale + multi2.Scale,
                          "123.45908 * 2.345 is not correct: " + result);
            multi1 = BigDecimal.Parse("34656");
            multi2 = BigDecimal.Parse("-2");
            result = multi1.Multiply(multi2);
            Assert.IsTrue(result.ToString().Equals("-69312") && result.Scale == 0, "34656 * 2 is not correct");
            multi1 = new BigDecimal(-2.345E-02);
            multi2 = new BigDecimal(-134E130);
            result = multi1.Multiply(multi2);
            Assert.IsTrue(result.ToDouble() == 3.1422999999999997E130 && result.Scale == multi1.Scale + multi2.Scale,
                          "-2.345E-02 * -134E130 is not correct " + result.ToDouble());
            multi1 = BigDecimal.Parse("11235");
            multi2 = BigDecimal.Parse("0");
            result = multi1.Multiply(multi2);
            Assert.IsTrue(result.ToDouble() == 0 && result.Scale == 0, "11235 * 0 is not correct");
            multi1 = BigDecimal.Parse("-0.00234");
            multi2 = new BigDecimal(13.4E10);
            result = multi1.Multiply(multi2);
            Assert.IsTrue(result.ToDouble() == -313560000 && result.Scale == multi1.Scale + multi2.Scale,
                          "-0.00234 * 13.4E10 is not correct");
        }
        public void Abs()
        {
            BigDecimal big    = BigDecimal.Parse("-1234");
            BigDecimal bigabs = big.Abs();

            Assert.IsTrue(bigabs.ToString().Equals("1234"), "the absolute value of -1234 is not 1234");
            big    = new BigDecimal(BigInteger.Parse("2345"), 2);
            bigabs = big.Abs();
            Assert.IsTrue(bigabs.ToString().Equals("23.45"), "the absolute value of 23.45 is not 23.45");
        }
        public void ParseString()
        {
            BigDecimal big = BigDecimal.Parse("345.23499600293850");

            Assert.IsTrue(big.ToString().Equals("345.23499600293850") && big.Scale == 14,
                          "the BigDecimal value is not initialized properly");
            big = BigDecimal.Parse("-12345");
            Assert.IsTrue(big.ToString().Equals("-12345") && big.Scale == 0, "the BigDecimal value is not initialized properly");
            big = BigDecimal.Parse("123.");
            Assert.IsTrue(big.ToString().Equals("123") && big.Scale == 0, "the BigDecimal value is not initialized properly");

            BigDecimal.Parse("1.234E02");
        }
        public void TestToString()
        {
            BigDecimal toString1 = BigDecimal.Parse("1234.000");

            Assert.IsTrue(toString1.ToString().Equals("1234.000"), "the ToString representation of 1234.000 is wrong");
            toString1 = BigDecimal.Parse("-123.4E-5");
            Assert.IsTrue(toString1.ToString().Equals("-0.001234"),
                          "the ToString representation of -123.4E-5 is wrong: " + toString1);
            toString1 = BigDecimal.Parse("-1.455E-20");
            Assert.IsTrue(toString1.ToString().Equals("-1.455E-20"), "the ToString representation of -1.455E-20 is wrong");
            toString1 = new BigDecimal(value2, 4);
            Assert.IsTrue(toString1.ToString().Equals("1233456.0000"), "the ToString representation of 1233456.0000 is wrong");
        }
        public void DivideBigDecimalII()
        {
            BigDecimal divd1 = new BigDecimal(value2, 4);
            BigDecimal divd2 = BigDecimal.Parse("0.0023");
            BigDecimal divd3 = divd1.Divide(divd2, 3, RoundingMode.HalfUp);

            Assert.IsTrue(divd3.ToString().Equals("536285217.391") && divd3.Scale == 3, "1233456/0.0023 is not correct");
            divd2 = new BigDecimal(1345.5E-02D);
            divd3 = divd1.Divide(divd2, 0, RoundingMode.Down);
            Assert.IsTrue(divd3.ToString().Equals("91672") && divd3.Scale == 0,
                          "1233456/13.455 is not correct or does not have the correct scale");
            divd2 = new BigDecimal(0000D);

            Assert.Throws <ArithmeticException>(() => divd1.Divide(divd2, 4, RoundingMode.Down));
        }
        public void ConstructorBigIntegerScale()
        {
            BigDecimal big = new BigDecimal(value2, 5);

            Assert.IsTrue(big.UnscaledValue.Equals(value2) && big.Scale == 5, "the BigDecimal value is not initialized properly");
            Assert.IsTrue(big.ToString().Equals("123345.60000"), "the BigDecimal value is not represented properly");
        }
        public void DivideBigDecimalI()
        {
            BigDecimal divd1 = new BigDecimal(value, 2);
            BigDecimal divd2 = BigDecimal.Parse("2.335");
            BigDecimal divd3 = divd1.Divide(divd2, RoundingMode.Up);

            Assert.IsTrue(divd3.ToString().Equals("52873.27") && divd3.Scale == divd1.Scale, "123459.08/2.335 is not correct");
            Assert.IsTrue(divd3.UnscaledValue.ToString().Equals("5287327"),
                          "the unscaledValue representation of 123459.08/2.335 is not correct");
            divd2 = new BigDecimal(123.4D);
            divd3 = divd1.Divide(divd2, RoundingMode.Down);
            Assert.IsTrue(divd3.ToString().Equals("1000.47") && divd3.Scale == 2, "123459.08/123.4  is not correct");
            divd2 = new BigDecimal(000D);

            Assert.Throws <ArithmeticException>(() => divd1.Divide(divd2, RoundingMode.Down));
        }
        public void ValueOfJI()
        {
            BigDecimal valueOfJI = BigDecimal.ValueOf(9223372036854775806L, 5);

            Assert.IsTrue(valueOfJI.UnscaledValue.ToString().Equals("9223372036854775806") && valueOfJI.Scale == 5,
                          "the bigDecimal equivalent of 92233720368547.75806 is wrong");
            Assert.IsTrue(valueOfJI.ToString().Equals("92233720368547.75806"),
                          "the ToString representation of 9223372036854775806 is wrong");
            valueOfJI = BigDecimal.ValueOf(1234L, 8);
            Assert.IsTrue(valueOfJI.UnscaledValue.ToString().Equals("1234") && valueOfJI.Scale == 8,
                          "the bigDecimal equivalent of 92233720368547.75806 is wrong");
            Assert.IsTrue(valueOfJI.ToString().Equals("0.00001234"),
                          "the ToString representation of 9223372036854775806 is wrong");
            valueOfJI = BigDecimal.ValueOf(0, 3);
            Assert.IsTrue(valueOfJI.UnscaledValue.ToString().Equals("0") && valueOfJI.Scale == 3,
                          "the bigDecimal equivalent of 92233720368547.75806 is wrong");
            Assert.IsTrue(valueOfJI.ToString().Equals("0.000"), "the ToString representation of 9223372036854775806 is wrong");
        }
        public void ValueOfJ()
        {
            BigDecimal valueOfL = BigDecimal.ValueOf(9223372036854775806L);

            Assert.IsTrue(valueOfL.UnscaledValue.ToString().Equals("9223372036854775806") && valueOfL.Scale == 0,
                          "the bigDecimal equivalent of 9223372036854775806 is wrong");
            Assert.IsTrue(valueOfL.ToString().Equals("9223372036854775806"),
                          "the ToString representation of 9223372036854775806 is wrong");
            valueOfL = BigDecimal.ValueOf(0L);
            Assert.IsTrue(valueOfL.UnscaledValue.ToString().Equals("0") && valueOfL.Scale == 0,
                          "the bigDecimal equivalent of 0 is wrong");
        }
        public void MovePointRightI()
        {
            BigDecimal movePtRight  = BigDecimal.Parse("-1.58796521458");
            BigDecimal alreadyMoved = movePtRight.MovePointRight(8);

            Assert.IsTrue(alreadyMoved.Scale == 3 && alreadyMoved.ToString().Equals("-158796521.458"),
                          "move point right 8 failed");
            movePtRight  = new BigDecimal(value, 2);
            alreadyMoved = movePtRight.MovePointRight(4);
            Assert.IsTrue(alreadyMoved.Scale == 0 && alreadyMoved.ToString().Equals("1234590800"), "move point right 4 failed");
            movePtRight  = new BigDecimal(134E12);
            alreadyMoved = movePtRight.MovePointRight(2);
            Assert.IsTrue(alreadyMoved.Scale == 0 && alreadyMoved.ToString().Equals("13400000000000000"),
                          "move point right 2 failed");
            movePtRight  = new BigDecimal(-3.4E-10);
            alreadyMoved = movePtRight.MovePointRight(5);
            Assert.IsTrue(alreadyMoved.Scale == movePtRight.Scale - 5 && alreadyMoved.ToDouble() == -0.000034,
                          "move point right 5 failed");
            alreadyMoved = alreadyMoved.MovePointRight(-5);
            Assert.IsTrue(alreadyMoved.Equals(movePtRight), "move point right -5 failed");
        }
        public void AddBigDecimal()
        {
            BigDecimal add1 = BigDecimal.Parse("23.456");
            BigDecimal add2 = BigDecimal.Parse("3849.235");
            BigDecimal sum  = add1.Add(add2);

            Assert.IsTrue(sum.UnscaledValue.ToString().Equals("3872691") && sum.Scale == 3,
                          "the sum of 23.456 + 3849.235 is wrong");
            Assert.IsTrue(sum.ToString().Equals("3872.691"), "the sum of 23.456 + 3849.235 is not printed correctly");
            BigDecimal add3 = new BigDecimal(12.34E02D);

            Assert.IsTrue((add1.Add(add3)).ToString().Equals("1257.456"), "the sum of 23.456 + 12.34E02 is not printed correctly");
        }
        public void MovePointLeftI()
        {
            BigDecimal movePtLeft   = BigDecimal.Parse("123456265.34");
            BigDecimal alreadyMoved = movePtLeft.MovePointLeft(5);

            Assert.IsTrue(alreadyMoved.Scale == 7 && alreadyMoved.ToString().Equals("1234.5626534"), "move point left 5 failed");
            movePtLeft   = new BigDecimal(value2.Negate(), 0);
            alreadyMoved = movePtLeft.MovePointLeft(12);
            Assert.IsTrue(alreadyMoved.Scale == 12 && alreadyMoved.ToString().Equals("-0.012334560000"),
                          "move point left 12 failed");
            movePtLeft   = new BigDecimal(123E18);
            alreadyMoved = movePtLeft.MovePointLeft(2);
            Assert.IsTrue(alreadyMoved.Scale == movePtLeft.Scale + 2 && alreadyMoved.ToDouble() == 1.23E18,
                          "move point left 2 failed");
            movePtLeft   = new BigDecimal(1.123E-12);
            alreadyMoved = movePtLeft.MovePointLeft(3);
            Assert.IsTrue(alreadyMoved.Scale == movePtLeft.Scale + 3 && alreadyMoved.ToDouble() == 1.123E-15,
                          "move point left 3 failed");
            movePtLeft   = new BigDecimal(value, 2);
            alreadyMoved = movePtLeft.MovePointLeft(-2);
            Assert.IsTrue(alreadyMoved.Scale == movePtLeft.Scale - 2 && alreadyMoved.ToString().Equals("12345908"),
                          "move point left -2 failed");
        }
        public void BigDecimalSerialization()
        {
            // Regression for HARMONY-1896
            char[]     input = { '1', '5', '6', '7', '8', '7', '.', '0', '0' };
            BigDecimal bd    = BigDecimal.Parse(input, 0, 9);

            MemoryStream    bos = new MemoryStream();
            BinaryFormatter oos = new BinaryFormatter();

            oos.Serialize(bos, bd);

            MemoryStream bis = new MemoryStream(bos.ToArray());
            BigDecimal   nbd = (BigDecimal)oos.Deserialize(bis);

            Assert.AreEqual(bd.ToInt32(), nbd.ToInt32());
            Assert.AreEqual(bd.ToDouble(), nbd.ToDouble(), 0.0);
            Assert.AreEqual(bd.ToString(), nbd.ToString());
        }
        public void ConstructorDouble()
        {
            BigDecimal big = new BigDecimal(123E04);

            Assert.Equal("1230000", big.ToString());
            big = new BigDecimal(1.2345E-12);
            Assert.Equal(1.2345E-12, big.ToDouble());
            big = new BigDecimal(-12345E-3);
            Assert.Equal(-12.345, big.ToDouble());
            big = new BigDecimal(5.1234567897654321e138);
            Assert.Equal(5.1234567897654321E138, big.ToDouble());
            Assert.Equal(0, big.Scale);
            big = new BigDecimal(0.1);
            Assert.True(big.ToDouble() == 0.1, "the double representation of 0.1 bigDecimal is not correct");
            big = new BigDecimal(0.00345);
            Assert.True(big.ToDouble() == 0.00345, "the double representation of 0.00345 bigDecimal is not correct");
            // regression test for HARMONY-2429
            big = new BigDecimal(-0.0);
            Assert.True(big.Scale == 0, "the double representation of -0.0 bigDecimal is not correct");
        }
        public void ConstructorDouble()
        {
            BigDecimal big = new BigDecimal(123E04);

            Assert.AreEqual("1230000", big.ToString(),
                            "the BigDecimal value taking a double argument is not initialized properly");
            big = new BigDecimal(1.2345E-12);
            Assert.AreEqual(1.2345E-12, big.ToDouble(), "the double representation is not correct");
            big = new BigDecimal(-12345E-3);
            Assert.AreEqual(-12.345, big.ToDouble(), "the double representation is not correct");
            big = new BigDecimal(5.1234567897654321e138);
            Assert.AreEqual(5.1234567897654321E138, big.ToDouble(), "the double representation is not correct");
            Assert.AreEqual(0, big.Scale, "the double representation is not correct");
            big = new BigDecimal(0.1);
            Assert.IsTrue(big.ToDouble() == 0.1, "the double representation of 0.1 bigDecimal is not correct");
            big = new BigDecimal(0.00345);
            Assert.IsTrue(big.ToDouble() == 0.00345, "the double representation of 0.00345 bigDecimal is not correct");
            // regression test for HARMONY-2429
            big = new BigDecimal(-0.0);
            Assert.IsTrue(big.Scale == 0, "the double representation of -0.0 bigDecimal is not correct");
        }
        public void SubtractBigDecimal()
        {
            BigDecimal sub1   = BigDecimal.Parse("13948");
            BigDecimal sub2   = BigDecimal.Parse("2839.489");
            BigDecimal result = sub1.Subtract(sub2);

            Assert.IsTrue(result.ToString().Equals("11108.511") && result.Scale == 3, "13948 - 2839.489 is wrong: " + result);
            BigDecimal result2 = sub2.Subtract(sub1);

            Assert.IsTrue(result2.ToString().Equals("-11108.511") && result2.Scale == 3, "2839.489 - 13948 is wrong");
            Assert.IsTrue(result.Equals(result2.Negate()), "13948 - 2839.489 is not the negative of 2839.489 - 13948");
            sub1   = new BigDecimal(value, 1);
            sub2   = BigDecimal.Parse("0");
            result = sub1.Subtract(sub2);
            Assert.IsTrue(result.Equals(sub1), "1234590.8 - 0 is wrong");
            sub1   = new BigDecimal(1.234E-03);
            sub2   = new BigDecimal(3.423E-10);
            result = sub1.Subtract(sub2);
            Assert.IsTrue(result.ToDouble() == 0.0012339996577, "1.234E-03 - 3.423E-10 is wrong, " + result.ToDouble());
            sub1   = new BigDecimal(1234.0123);
            sub2   = new BigDecimal(1234.0123000);
            result = sub1.Subtract(sub2);
            Assert.IsTrue(result.ToDouble() == 0.0, "1234.0123 - 1234.0123000 is wrong, " + result.ToDouble());
        }
        public void SetScaleII()
        {
            BigDecimal setScale1 = new BigDecimal(2.323E102);
            BigDecimal setScale2 = setScale1.SetScale(4);

            Assert.IsTrue(setScale2.Scale == 4, "the number 2.323E102 after setting scale is wrong");
            Assert.IsTrue(setScale2.ToDouble() == 2.323E102, "the representation of the number 2.323E102 is wrong");
            setScale1 = BigDecimal.Parse("-1.253E-12");
            setScale2 = setScale1.SetScale(17, RoundingMode.Ceiling);
            Assert.IsTrue(setScale2.Scale == 17, "the number -1.253E-12 after setting scale is wrong");
            Assert.IsTrue(setScale2.ToString().Equals("-1.25300E-12"),
                          "the representation of the number -1.253E-12 after setting scale is wrong, " + setScale2);

            // testing rounding Mode ROUND_CEILING
            setScale1 = new BigDecimal(value, 4);
            setScale2 = setScale1.SetScale(1, RoundingMode.Ceiling);
            Assert.IsTrue(setScale2.ToString().Equals("1234.6") && setScale2.Scale == 1,
                          "the number 1234.5908 after setting scale to 1/ROUND_CEILING is wrong");
            BigDecimal setNeg = new BigDecimal(value.Negate(), 4);

            setScale2 = setNeg.SetScale(1, RoundingMode.Ceiling);
            Assert.IsTrue(setScale2.ToString().Equals("-1234.5") && setScale2.Scale == 1,
                          "the number -1234.5908 after setting scale to 1/ROUND_CEILING is wrong");

            // testing rounding Mode ROUND_DOWN
            setScale2 = setNeg.SetScale(1, RoundingMode.Down);
            Assert.IsTrue(setScale2.ToString().Equals("-1234.5") && setScale2.Scale == 1,
                          "the number -1234.5908 after setting scale to 1/ROUND_DOWN is wrong");
            setScale1 = new BigDecimal(value, 4);
            setScale2 = setScale1.SetScale(1, RoundingMode.Down);
            Assert.IsTrue(setScale2.ToString().Equals("1234.5") && setScale2.Scale == 1,
                          "the number 1234.5908 after setting scale to 1/ROUND_DOWN is wrong");

            // testing rounding Mode ROUND_FLOOR
            setScale2 = setScale1.SetScale(1, RoundingMode.Floor);
            Assert.IsTrue(setScale2.ToString().Equals("1234.5") && setScale2.Scale == 1,
                          "the number 1234.5908 after setting scale to 1/ROUND_FLOOR is wrong");
            setScale2 = setNeg.SetScale(1, RoundingMode.Floor);
            Assert.IsTrue(setScale2.ToString().Equals("-1234.6") && setScale2.Scale == 1,
                          "the number -1234.5908 after setting scale to 1/ROUND_FLOOR is wrong");

            // testing rounding Mode ROUND_HALF_DOWN
            setScale2 = setScale1.SetScale(3, RoundingMode.HalfDown);
            Assert.IsTrue(setScale2.ToString().Equals("1234.591") && setScale2.Scale == 3,
                          "the number 1234.5908 after setting scale to 3/ROUND_HALF_DOWN is wrong");
            setScale1 = new BigDecimal(BigInteger.Parse("12345000"), 5);
            setScale2 = setScale1.SetScale(1, RoundingMode.HalfDown);
            Assert.IsTrue(setScale2.ToString().Equals("123.4") && setScale2.Scale == 1,
                          "the number 123.45908 after setting scale to 1/ROUND_HALF_DOWN is wrong");
            setScale2 = BigDecimal.Parse("-1234.5000").SetScale(0, RoundingMode.HalfDown);
            Assert.IsTrue(setScale2.ToString().Equals("-1234") && setScale2.Scale == 0,
                          "the number -1234.5908 after setting scale to 0/ROUND_HALF_DOWN is wrong");

            // testing rounding Mode ROUND_HALF_EVEN
            setScale1 = new BigDecimal(1.2345789D);
            setScale2 = setScale1.SetScale(4, RoundingMode.HalfEven);
            Assert.IsTrue(setScale2.ToDouble() == 1.2346D && setScale2.Scale == 4,
                          "the number 1.2345789 after setting scale to 4/ROUND_HALF_EVEN is wrong");
            setNeg    = new BigDecimal(-1.2335789D);
            setScale2 = setNeg.SetScale(2, RoundingMode.HalfEven);
            Assert.IsTrue(setScale2.ToDouble() == -1.23D && setScale2.Scale == 2,
                          "the number -1.2335789 after setting scale to 2/ROUND_HALF_EVEN is wrong");
            setScale2 = BigDecimal.Parse("1.2345000").SetScale(3,
                                                               RoundingMode.HalfEven);
            Assert.IsTrue(setScale2.ToDouble() == 1.234D && setScale2.Scale == 3,
                          "the number 1.2345789 after setting scale to 3/ROUND_HALF_EVEN is wrong");
            setScale2 = BigDecimal.Parse("-1.2345000").SetScale(3,
                                                                RoundingMode.HalfEven);
            Assert.IsTrue(setScale2.ToDouble() == -1.234D && setScale2.Scale == 3,
                          "the number -1.2335789 after setting scale to 3/ROUND_HALF_EVEN is wrong");

            // testing rounding Mode ROUND_HALF_UP
            setScale1 = BigDecimal.Parse("134567.34650");
            setScale2 = setScale1.SetScale(3, RoundingMode.HalfUp);
            Assert.IsTrue(setScale2.ToString().Equals("134567.347") && setScale2.Scale == 3,
                          "the number 134567.34658 after setting scale to 3/ROUND_HALF_UP is wrong");
            setNeg    = BigDecimal.Parse("-1234.4567");
            setScale2 = setNeg.SetScale(0, RoundingMode.HalfUp);
            Assert.IsTrue(setScale2.ToString().Equals("-1234") && setScale2.Scale == 0,
                          "the number -1234.4567 after setting scale to 0/ROUND_HALF_UP is wrong");

            Assert.Throws <ArithmeticException>(() => setScale1.SetScale(3, RoundingMode.Unnecessary));

            // testing rounding Mode ROUND_UP
            setScale1 = BigDecimal.Parse("100000.374");
            setScale2 = setScale1.SetScale(2, RoundingMode.Up);
            Assert.IsTrue(setScale2.ToString().Equals("100000.38") && setScale2.Scale == 2,
                          "the number 100000.374 after setting scale to 2/ROUND_UP is wrong");
            setNeg    = new BigDecimal(-134.34589D);
            setScale2 = setNeg.SetScale(2, RoundingMode.Up);
            Assert.IsTrue(setScale2.ToDouble() == -134.35D && setScale2.Scale == 2,
                          "the number -134.34589 after setting scale to 2/ROUND_UP is wrong");

            Assert.Throws <ArgumentException>(() => setScale1.SetScale(0, -123));
        }