Вопрос

Возможные дубликаты:
Большие целые числа в C#
C# неограниченные значительные десятичные цифры (произвольная точность) без Java

Я читаю вопрос в Произвольная точность десятичных средств в C#? Но у меня нет библиотеки J#. Мне нужна библиотека для произвольной точной десятики с C#.

Это было полезно?

Решение

Большое десятичное:

Big Int (если вам нравится решение JD или вы хотите придумать класс типа рационального числа/фракции. Это, и я каким -то образом пропустил, что вы искали десятичные активы, а не INT):

Другие советы

Вы можете реализовать свой собственный на основе класса Biginteger .net 4.0. Я сделал это для развлечения, это только умножение:

public struct BigDecimal {
    public BigInteger Integer { get; set; }
    public BigInteger Scale { get; set; }

    public BigDecimal(BigInteger integer, BigInteger scale) : this() {
        Integer = integer;
        Scale = scale;
        while (Scale > 0 && Integer % 10 == 0) {
            Integer /= 10;
            Scale -= 1;
        }
    }

    public static implicit operator BigDecimal(decimal a) {
        BigInteger integer = (BigInteger)a;
        BigInteger scale = 0;
        decimal scaleFactor = 1m;
        while ((decimal)integer != a * scaleFactor) {
            scale += 1;
            scaleFactor *= 10;
            integer = (BigInteger)(a * scaleFactor);
        }
        return new BigDecimal(integer, scale);
    }

    public static BigDecimal operator *(BigDecimal a, BigDecimal b) {
        return new BigDecimal(a.Integer * b.Integer, a.Scale + b.Scale);
    }

    public override string ToString() {
        string s = Integer.ToString();
        if (Scale != 0) {
            if (Scale > Int32.MaxValue) return "[Undisplayable]";
            int decimalPos = s.Length - (int)Scale;
            s = s.Insert(decimalPos, decimalPos == 0 ? "0." : ".");
        }
        return s;
    }
}

...

decimal d1 = 254727458263237.1356246819m;
decimal d2 = 991658834219519273.110324m;
// MessageBox.Show((d1 * d2).ToString()); // OverflowException
BigDecimal bd1 = d1;
BigDecimal bd2 = d2;
MessageBox.Show((bd1 * bd2).ToString()); // 252602734305022989458258125319270.5452949161059356

Всегда есть GNU MP обертка для .NET Пока вы не против использовать GMP.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top