public static BigDecimal operator /(BigDecimal a, BigDecimal b) { BigDecimal outVal = 0; var maxPrecision = BigInteger.Max(a._scale, b._scale); if (a._scale < maxPrecision) { a._scale = (ushort)maxPrecision; a._value = a._value * BIPow(10, maxPrecision - a._scale); } if (b._scale < maxPrecision) { b._scale = (ushort)maxPrecision; b._value = b._value * BIPow(10, maxPrecision - b._scale); } outVal._value = BigInteger.DivRem(a._value, b._value, out var remainder); while (remainder != 0 && outVal._scale < MaxPrecision) { while (BigInteger.Abs(remainder) < BigInteger.Abs(b._value)) { remainder *= 10; outVal._value *= 10; outVal._scale++; } outVal._value = outVal._value + BigInteger.DivRem(remainder, b._value, out remainder); } return(outVal); }