/// <summary>
 /// internal function for negation
 /// </summary>
 private static Fraction Negate(Fraction frac1)
 {
     long iNumerator = -frac1.Numerator;
     long iDenominator = frac1.Denominator;
     return (new Fraction(iNumerator, iDenominator));
 }
 /// <summary>
 /// The function replicates current Fraction object
 /// </summary>
 public Fraction Duplicate()
 {
     Fraction frac = new Fraction();
     frac.Numerator = Numerator;
     frac.Denominator = Denominator;
     return frac;
 }
 private static Fraction Multiply(Fraction frac1, Fraction frac2)
 {
     try
     {
         checked
         {
             long iNumerator = frac1.Numerator * frac2.Numerator;
             long iDenominator = frac1.Denominator * frac2.Denominator;
             return (new Fraction(iNumerator, iDenominator));
         }
     }
     catch (OverflowException)
     {
         throw new FractionException("Overflow occurred while performing arithemetic operation");
     }
     catch (Exception)
     {
         throw new FractionException("An error occurred while performing arithemetic operation");
     }
 }
 /// <summary>
 /// The function takes a floating point number as an argument 
 /// and returns its corresponding reduced fraction
 /// </summary>
 public static Fraction ToFraction(double dValue)
 {
     try
     {
         checked
         {
             Fraction frac;
             if (dValue % 1 == 0)	// if whole number
             {
                 frac = new Fraction((long)dValue);
             }
             else
             {
                 double dTemp = dValue;
                 long iMultiple = 1;
                 string strTemp = dValue.ToString();
                 while (strTemp.IndexOf("E") > 0)	// if in the form like 12E-9
                 {
                     dTemp *= 10;
                     iMultiple *= 10;
                     strTemp = dTemp.ToString();
                 }
                 int i = 0;
                 while (strTemp[i] != '.')
                     i++;
                 int iDigitsAfterDecimal = strTemp.Length - i - 1;
                 while (iDigitsAfterDecimal > 0)
                 {
                     dTemp *= 10;
                     iMultiple *= 10;
                     iDigitsAfterDecimal--;
                 }
                 frac = new Fraction((int)Math.Round(dTemp), iMultiple);
             }
             return frac;
         }
     }
     catch (OverflowException)
     {
         throw new FractionException("Conversion not possible due to overflow");
     }
     catch (Exception)
     {
         throw new FractionException("Conversion not possible");
     }
 }
        /// <summary>
        /// The function reduces(simplifies) a Fraction object by dividing both its numerator 
        /// and denominator by their GCD
        /// </summary>
        public static void ReduceFraction(Fraction frac)
        {
            try
            {
                if (frac.Numerator == 0)
                {
                    frac.Denominator = 1;
                    return;
                }

                long iGCD = GCD(frac.Numerator, frac.Denominator);
                frac.Numerator /= iGCD;
                frac.Denominator /= iGCD;

                if (frac.Denominator < 0)	// if -ve sign in denominator
                {
                    //pass -ve sign to numerator
                    frac.Numerator *= -1;
                    frac.Denominator *= -1;
                }
            } // end try
            catch (Exception exp)
            {
                throw new FractionException("Cannot reduce Fraction: " + exp.Message);
            }
        }
        /// <summary>
        /// The function returns the inverse of a Fraction object
        /// </summary>
        public static Fraction Inverse(Fraction frac1)
        {
            if (frac1.Numerator == 0)
                throw new FractionException("Operation not possible (Denominator cannot be assigned a ZERO Value)");

            long iNumerator = frac1.Denominator;
            long iDenominator = frac1.Numerator;
            return (new Fraction(iNumerator, iDenominator));
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            Random rnd = new Random();
            decimal d1;
            decimal d2;
            int maxDigitLimit = 3; // specify to any digit

            d1 = randomDecimal(rnd, maxDigitLimit);
            d2 = randomDecimal(rnd, maxDigitLimit);

            lblRandomDecimal1.Text = d1.ToString();
            lblRandomDecimal2.Text = d2.ToString();
            lblSubtractionResult.Text = (d1 - d2).ToString();

            string ClientIP = Request.UserHostAddress;

            Fraction f1 = new Fraction("1/2");
            Fraction f2 = new Fraction("2/3");

            lblSubtractionResult.Text = (f1 + f2).ToString();
        }
 protected void btnDoIt_Click(object sender, EventArgs e)
 {
     Fraction f1 = new Fraction(txt1a.Text + "/" + txt1b.Text);
     Fraction f2 = new Fraction(txt2a.Text + "/" + txt2b.Text);
     switch(ddlFunction.SelectedValue)
     {
         case "+":
             lblResult.Text = (f1 + f2).ToString();
             break;
         case "-":
             lblResult.Text = (f1 - f2).ToString();
             break;
         case "/":
             lblResult.Text = (f1 / f2).ToString();
             break;
         case "*":
             lblResult.Text = (f1 * f2).ToString();
             break;
         default: break;
     }
 }