private static decimal DecimalScale(BigFraction bigFraction)
        {
            if (bigFraction.Numerator <= MAX_DECIMAL && bigFraction.Numerator >= MIN_DECIMAL &&
                bigFraction.Denominator <= MAX_DECIMAL && bigFraction.Denominator >= MIN_DECIMAL)
            {
                return((decimal)bigFraction.Numerator / (decimal)bigFraction.Denominator);
            }

            var intPart = bigFraction.Numerator / bigFraction.Denominator;

            if (intPart != 0)
            {
                return((decimal)intPart + DecimalScale(bigFraction - intPart));
            }
            else
            {
                if (bigFraction.Numerator == 0)
                {
                    return(0);
                }
                else
                {
                    return(1 / DecimalScale(1 / bigFraction));
                };
            }
        }
        //Double constructor
        public BigFraction(double dou, double accuracy = 1e-15)
        {
            BigFraction f = FromDouble(dou, accuracy);

            Numerator   = f.Numerator;
            Denominator = f.Denominator;
        }
        //Operator %
        public static BigFraction operator %(BigFraction r, BigInteger mod)
        {
            BigInteger  modmulden = r.Denominator * mod;
            BigInteger  remainder = r.Numerator % modmulden;
            BigFraction answer    = new BigFraction(remainder, r.Denominator);

            return(answer);
        }