/// <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> /// Phương thức trả về số lượng sau dấu ".". /// </summary> /// <param name="n">Số thập phân.</param> /// <returns>số lượng số nguyên sau dấu ".".</returns> private static int CountDecimal(BigDecimal n) { int count = 0; while (!n.IsZero) { count++; n = n.Multiply(BigDecimal.Ten); n = n.Subtract(n.DivideToIntegralValue(BigDecimal.One)); } return(count); }
/// <summary> /// Kiểm tra số vừa nhập là số nguyên dương. /// </summary> /// <param name="n">Số nhận từ bên ngoài.</param> /// <returns></returns> private static bool IsWhole(BigDecimal n) { return(n == n.DivideToIntegralValue(BigDecimal.One)); }
public void DivideToIntegralValueMathContextUp() { String a = "3736186567876876578956958765675671119238118911893939591735"; int aScale = 45; String b = "134432345432345748766876876723342238476237823787879183470"; int bScale = 70; int precision = 32; RoundingMode rm = RoundingMode.Up; MathContext mc = new MathContext(precision, rm); String c = "277923185514690367474770683"; int resScale = 0; BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale); BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale); BigDecimal result = aNumber.DivideToIntegralValue(bNumber, mc); Assert.AreEqual(c, result.ToString(), "incorrect value"); Assert.AreEqual(resScale, result.Scale, "incorrect scale"); }
public void DivideToIntegralValueMathContextDown() { String a = "3736186567876876578956958769675785435673453453653543654354365435675671119238118911893939591735"; int aScale = 45; String b = "134432345432345748766876876723342238476237823787879183470"; int bScale = 70; int precision = 75; RoundingMode rm = RoundingMode.Down; MathContext mc = new MathContext(precision, rm); String c = "2.7792318551469036747477068339450205874992634417590178670822889E+62"; int resScale = -1; BigDecimal aNumber = new BigDecimal(BigInteger.Parse(a), aScale); BigDecimal bNumber = new BigDecimal(BigInteger.Parse(b), bScale); BigDecimal result = aNumber.DivideToIntegralValue(bNumber, mc); Assert.AreEqual(c, result.ToString(), "incorrect value"); Assert.AreEqual(resScale, result.Scale, "incorrect scale"); }