Произвольная точность десятичных дробей в C#
Возможные дубликаты:
Большие целые числа в C#
C# неограниченное количество значащих десятичных цифр (произвольная точность) без Java
Я прочитал вопрос на произвольной точности десятичных знаков в C#? но у меня нет библиотеки J #. Мне нужна библиотека для произвольной точности десятичных знаков с C#.
3 ответа
Решение
Большой десятичный
- Установите среду выполнения J# (это бесплатно): http://www.microsoft.com/downloads/en/details.aspx?familyid=f72c74b3-ed0e-4af8-ae63-2f0e42501be1&displaylang=en
Big Int (Если вам нравится решение JD, или вы хотите создать рациональный класс с типом числа / дроби. Это, и я почему-то упустил, что вы искали десятичные, а не целые числа):
- Получить C# 4.0: большие целые числа в C#
- Получить класс IntX: http://intx.codeplex.com/
Вы можете реализовать свой собственный, основанный на классе 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.