예제 #1
0
        public object Clone()
        {
            var clone = new BigIntWithUnit();

            for (var i = 0; i < _intArray.Count; i++)
            {
                clone.SafeSetPart(i, _intArray[i]);
            }
            return(clone);
        }
예제 #2
0
        private static BigIntWithUnit CreateNumberFromDecimalString(string[] numberAsString)
        {
            var result = new BigIntWithUnit(numberAsString[0]);

            if (numberAsString.Length > 1)
            {
                var decimalPart = numberAsString[1];
                decimalPart = decimalPart.PadRight(3, '0');
                result.SafeSetPart(0, ushort.Parse(decimalPart.Substring(0, 3)));
            }
            return(result);
        }
예제 #3
0
        /// <summary>
        /// Calculates number + (number * percent / 100)
        /// </summary>
        /// <param name="percent"></param>
        public void IncreasePercent(int percent)
        {
            var thousand = percent * 10;
            var toAdd    = new BigIntWithUnit();

            var overflow = (ushort)(_intArray[0] * thousand / 1000);

            for (var i = 1; i <= _intArray.Count + 1; i++)
            {
                var result = SafeGetPart(i) * thousand;
                result += overflow;
                toAdd.SafeSetPart(i - 1, (ushort)(result % 1000));
                overflow = (ushort)(result / 1000);
            }

            Add(toAdd);
        }
예제 #4
0
        /// <summary>
        /// Divides this to elem2 with presision of two digits after comma
        /// </summary>
        public BigIntWithUnit Divide(BigIntWithUnit elem2)
        {
            if (elem2 == 0 || this == 0)
            {
                return(0);
            }
            Trim();
            elem2.Trim();
            if (_intArray.Count - elem2._intArray.Count > 1)
            {
                BigIntWithUnit recursionTemp = (BigIntWithUnit)Clone();
                recursionTemp.ShiftRight(3);
                BigIntWithUnit recursionResult = recursionTemp.Divide(elem2);
                recursionResult.ShiftLeft(3);
                return(recursionResult);
            }
            if (elem2._intArray.Count - _intArray.Count > 1)
            {
                return(0);
            }

            //Actual division by substraction
            //Only need the first two parts because of accuracy
            BigIntWithUnit tempElem1 = 0;
            BigIntWithUnit tempElem2 = 0;

            if (_intArray.Count == elem2._intArray.Count)
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 2));
                tempElem1.SafeSetPart(1, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 2));
                tempElem2.SafeSetPart(1, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }
            else if (elem2._intArray.Count > _intArray.Count)
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 2));
                tempElem2.SafeSetPart(1, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }
            else
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 2));
                tempElem1.SafeSetPart(1, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }

            BigIntWithUnit result = 0;
            int            j      = 0;

            if (tempElem2 == 0)
            {
                return(0);
            }
            while (tempElem2 < 100)
            {
                tempElem2.ShiftLeft(1);
                j++;
            }
            for (var i = j; i > -3; i--)
            {
                while (tempElem1 >= tempElem2 && tempElem2 != 0)
                {
                    tempElem1.Sub(tempElem2);
                    result += Math.Pow(10, i);
                }
                var toAdd = (tempElem2.SafeGetPart(1) * 100) % 1000;
                tempElem2.SafeSetPart(1, (ushort)(tempElem2.SafeGetPart(1) / 10));
                tempElem2.SafeSetPart(0, (ushort)(tempElem2.SafeGetPart(0) / 10 + toAdd));
            }

            return(result);
        }