Mike
Mike

Reputation: 3284

BigInteger string representation with decimal places

I'm trying to create a decimal representation of a big integer when it's divided by something. The follwoing is the code which does it, basically I want the precision to be of 2 places.

    public string GetDecimal(BigInteger bigInteger,int divisor)
    {
        var remainder   = BigInteger.Remainder(bigInteger, divisor);
        var dividend    = BigInteger.Divide(bigInteger, divisor);

        var d = ((double)remainder / divisor);
        var decimalPart = Math.Round(d, 2);
        var retValue = dividend + decimalPart.ToString(".00");
        return retValue;
    }
}

Is there a better way of doing this please?

Thanks, -Mike

Upvotes: 1

Views: 2005

Answers (4)

Austin Salonen
Austin Salonen

Reputation: 50235

You should probably not convert the types and do the long division on your own. This should work with any BigInteger value.

I'm sure there's room for improvement here...

public string GetDecimal(BigInteger bigInteger, int divisor)
{
    BigInteger remainder;
    var quotient = BigInteger.DivRem(bigInteger, divisor, out remainder);

    const int decimalPlaces = 2;
    var decimalPart = BigInteger.Zero;
    for(int i = 0; i < decimalPlaces; i++)
    {
        var div = (remainder*10)/divisor;

        decimalPart *= 10;
        decimalPart += div;

        remainder = remainder*10 - div*divisor;
    }

    var retValue = quotient.ToString() + "." + decimalPart.ToString(new string('0', decimalPlaces));
    return retValue;
}

Upvotes: 2

CodesInChaos
CodesInChaos

Reputation: 108830

var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString();
return s.Insert(".",s.Length-2);

This code only works for positive values, and uses AwayFromZero midpoint rounding. I also didn't care about localization issues.

Upvotes: 0

Tony Hopkinson
Tony Hopkinson

Reputation: 20320

Instead of doing maths on it especially using less accurate types like double. simply build a string with all but the last two digits, append a decimal point and then put the last one in.

e.g. Something like

int precision = 2;
negative = 0;
if (bigInteger < 0)
{
   negative = 1;
}
String strValue = bigInteger.ToString().PadRight(precision + negative + 1,'0');
return strValue.Insert(strValue.Length - precision, ".");

Upvotes: 0

Matthew
Matthew

Reputation: 25773

The built in .net decimal type is 128bit, and works with similar rounding constructs of other types. Is this number not large enough?

Upvotes: 0

Related Questions