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); }