/// <summary>
        ///   Chuyển số thập phân thành hỗn số.
        /// </summary>
        /// <param name="n">Số thập phân nhận từ bên ngoài.</param>
        /// <returns>Phần thực của hỗn số</returns>
        private static FractionBigNum ChangeFraction(BigDecimal n)
        {
            FractionBigNum frac = new FractionBigNum();

            int sign = n.Sign;

            n = n.Abs();

            BigDecimal whole = n.DivideToIntegralValue(BigDecimal.One);

            BigDecimal decimalPoint = n.Subtract(whole);

            frac.Numerator   = decimalPoint.Multiply(BigDecimal.Ten.Pow(CountDecimal(decimalPoint))).DivideToIntegralValue(BigDecimal.One);
            frac.Denominator = BigDecimal.Ten.Pow(CountDecimal(decimalPoint)).DivideToIntegralValue(BigDecimal.One);
            frac.Minimalism();

            if (!whole.IsZero)
            {
                //If Whole is not zero then we change whole to fraction, add fraction.
                FractionBigNum frac2 = new FractionBigNum(whole, BigDecimal.One);
                frac = frac + frac2;
            }

            frac.Numerator *= sign;

            return(frac);
        }
        /// <summary>
        /// Phương thức trả về số lượng sau dấu ".".
        /// </summary>
        /// <param name="n">Số thập phân.</param>
        /// <returns>số lượng số nguyên sau dấu ".".</returns>
        private static int CountDecimal(BigDecimal n)
        {
            int count = 0;

            while (!n.IsZero)
            {
                count++;
                n = n.Multiply(BigDecimal.Ten);
                n = n.Subtract(n.DivideToIntegralValue(BigDecimal.One));
            }

            return(count);
        }
 /// <summary>
 /// Kiểm tra số vừa nhập là số nguyên dương.
 /// </summary>
 /// <param name="n">Số nhận từ bên ngoài.</param>
 /// <returns></returns>
 private static bool IsWhole(BigDecimal n)
 {
     return(n == n.DivideToIntegralValue(BigDecimal.One));
 }
 public void DivideToIntegralValueMathContextUp()
 {
     String a = "3736186567876876578956958765675671119238118911893939591735";
     int aScale = 45;
     String b = "134432345432345748766876876723342238476237823787879183470";
     int bScale = 70;
     int precision = 32;
     RoundingMode rm = RoundingMode.Up;
     MathContext mc = new MathContext(precision, rm);
     String c = "277923185514690367474770683";
     int resScale = 0;
     BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale);
     BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale);
     BigDecimal result = aNumber.DivideToIntegralValue(bNumber, mc);
     Assert.AreEqual(c, result.ToString(), "incorrect value");
     Assert.AreEqual(resScale, result.Scale, "incorrect scale");
 }
 public void DivideToIntegralValueMathContextDown()
 {
     String a = "3736186567876876578956958769675785435673453453653543654354365435675671119238118911893939591735";
     int aScale = 45;
     String b = "134432345432345748766876876723342238476237823787879183470";
     int bScale = 70;
     int precision = 75;
     RoundingMode rm = RoundingMode.Down;
     MathContext mc = new MathContext(precision, rm);
     String c = "2.7792318551469036747477068339450205874992634417590178670822889E+62";
     int resScale = -1;
     BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale);
     BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale);
     BigDecimal result = aNumber.DivideToIntegralValue(bNumber, mc);
     Assert.AreEqual(c, result.ToString(), "incorrect value");
     Assert.AreEqual(resScale, result.Scale, "incorrect scale");
 }