Search code examples
c#bigintegerfractions

C# BigInteger remainder as fraction


Before you read, please be aware that I'm aware of the differences between integer and floating-point division, and I'm aware of how BigInteger.DivRem and BigInteger.Divide.

Consider the following code examples:

BigInteger a = new(5);
BigInteger b = new(2);

BigInteger div = BigInteger.DivRem(a, b, out BigInteger rem);

Console.WriteLine($"{div}.{rem}");

Output = 2.1

BigInteger a = new(5678);
BigInteger b = new(1234);

BigInteger div = BigInteger.DivRem(a, b, out BigInteger rem);

Console.WriteLine($"{div}.{rem}");

Output = 4.742

Neither of the outputs is correct (in the context of what I'm asking). Sure, they're correct in the sense that they're displaying a division and a remainder formatted as ${div}.{rem}, but in my case, that's not what I'm looking for.

The correct values would be 2.5 and 4.6012965964 (with a scale of 10 digits) respectively.

Is there a way to convert/represent the remainder as a fractional value, rather than as a remainder?

Note: I know there is float, double and decimal, but those aren't the solution I'm looking for.


Solution

  • This seems to work:

    BigInteger a = new(5678);
    BigInteger b = new(1234);
    
    BigInteger div = BigInteger.DivRem(a, b, out BigInteger rem);
    
    var decimalDigits = new List<BigInteger>();
    
    while (rem != 0 && decimalDigits.Count < 10)
    {
        rem *= 10;
        decimalDigits.Add(BigInteger.DivRem(rem, b, out rem));
    }
    
    Console.WriteLine($"{div}.{string.Concat(decimalDigits)}");
    

    This is pretty much just an implementation of long division.