public object Clone() { var clone = new BigIntWithUnit(); for (var i = 0; i < _intArray.Count; i++) { clone.SafeSetPart(i, _intArray[i]); } return(clone); }
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); }
/// <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); }
/// <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); }