BigInteger строковое представление с десятичными разрядами - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь создать десятичное представление большого целого, когда оно делится на что-то.Вот код, который делает это, в основном я хочу, чтобы точность была в 2-х местах.

    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;
    }
}

Есть ли лучший способ сделать это, пожалуйста?

Спасибо, Майк

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

Вы, вероятно, не должны преобразовывать типы и делать длинное деление самостоятельно.Это должно работать с любым значением BigInteger.

Я уверен, что здесь есть возможности для совершенствования ...

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;
}
0 голосов
/ 23 февраля 2012
var s=((bigInteger*200+divisor)/(2*(BigInteger)divisor)).ToString();
return s.Insert(".",s.Length-2);

Этот код работает только для положительных значений и использует AwayFromZero округление средней точки.Я также не заботился о проблемах локализации.

0 голосов
/ 23 февраля 2012

Вместо математики, особенно с использованием менее точных типов, таких как double.просто создайте строку со всеми, кроме последних двух цифр, добавьте десятичную точку и затем введите последнюю.

например что-то вроде

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, ".");
0 голосов
/ 23 февраля 2012

Встроенный тип .net decimal имеет размер 128 бит и работает с аналогичными конструкциями округления других типов. Это число недостаточно велико?

...