/// <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>
        ///    Round fraction is looking clearly.
        /// </summary>
        /// <param name="frac">Bignum</param>
        /// <returns></returns>
        private static FractionBigNum Round(FractionBigNum frac)
        {
            int countDecimal = CountDecimal(frac.Numerator);

            if (IsWhole(frac.Numerator))
            {
                frac.Numerator = frac.Numerator.SetScale(0, RoundingMode.HalfEven);
            }
            else
            {
                frac.Numerator = frac.Numerator.SetScale(countDecimal, RoundingMode.HalfEven);
            }

            countDecimal = CountDecimal(frac.Denominator);

            if (IsWhole(frac.Denominator))
            {
                frac.Denominator = frac.Denominator.SetScale(0, RoundingMode.HalfEven);
            }
            else
            {
                frac.Denominator = frac.Denominator.SetScale(countDecimal, RoundingMode.HalfEven);
            }

            return(frac);
        }
        public static FractionBigNum operator /(FractionBigNum num1, FractionBigNum num2)
        {
            FractionBigNum frac = new FractionBigNum(num1.Numerator.Multiply(num2.Denominator), num1.Denominator.Multiply(num2.Numerator));

            frac.Minimalism();
            return(frac);
        }
        /// <summary>
        ///     Xử lí phân số nếu tử hoặc mẫu là số thập phân.
        /// </summary>
        /// <param name="cal"> Lớp Tính toán dùng độc lập để tính toán trả về kết quả.</param>
        /// <param name="num"> Tử số</param>
        /// <param name="demo"> Mẫu số</param>
        /// <returns></returns>
        public static FractionBigNum ToFractionBignum(BigDecimal num, BigDecimal demo)
        {
            try
            {
                ResolveNegative(ref num, ref demo);

                //Nếu phân số đầu tiên là số nguyên ta sẽ làm bình thường
                if (IsWhole(num) && IsWhole(demo))
                {
                    return(Round(new FractionBigNum(num, demo)));
                }
                else
                {
                    if (!IsWhole(num) && IsWhole(demo))
                    {
                        FractionBigNum fracNum = ChangeFraction(num);
                        fracNum.Minimalism();

                        FractionBigNum fracDemo = new FractionBigNum(BigDecimal.One, demo);

                        FractionBigNum Result = fracNum * fracDemo;

                        return(Round(Result));
                    }
                    else
                    {
                        if (IsWhole(num) && !IsWhole(demo))
                        {
                            FractionBigNum fracNum = new FractionBigNum(num, BigDecimal.One);

                            FractionBigNum fracDemo = ChangeFraction(demo);
                            fracDemo.Minimalism();

                            FractionBigNum Result = fracNum / fracDemo;

                            return(Round(Result));
                        }
                        else
                        {
                            FractionBigNum fracNum = ChangeFraction(num);
                            fracNum.Minimalism();

                            FractionBigNum fracDemo = ChangeFraction(demo);
                            fracDemo.Minimalism();

                            FractionBigNum Result = fracNum / fracDemo;

                            return(Round(Result));
                        }
                    }
                }
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
                throw new Exception("Kiểm tra tử sử hoặc mẫu số nhập hợp lệ không, có thể mẫu số bằng 0?");
            }
        }
        //Operator overloading
        #region Phân số với phân số
        public static FractionBigNum operator +(FractionBigNum num1, FractionBigNum num2)
        {
            BigDecimal     num  = num1.Numerator.Multiply(num2.Denominator).Add(num2.Numerator.Multiply(num1.Denominator));
            BigDecimal     demo = num1.Denominator.Multiply(num2.Denominator);
            FractionBigNum frac = new FractionBigNum(num, demo);

            frac.Minimalism();
            return(frac);
        }
 //Sao chép dữ liệu đã có sẵn.
 public void Coppy(FractionBigNum num)
 {
     Numerator   = num.Numerator;
     Denominator = num.Denominator;
 }