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