Что такое эквивалент класса Java BigDecimal в C#?
BigDecimal
класса в java.math
пакет, который имеет много преимуществ для обработки больших чисел определенного масштаба. Есть ли эквивалентный класс или тип данных в c# с этой функцией.
6 ответов
в C# только BigInteger
построил его (в .NET framework 4).
и decimal
достаточная точность для вашей задачи? Это 128-битное число, которое может содержать значения в диапазоне ±1.0 × 10-28 до ± × 7.9 1028.
совсем недавно мне также понадобился произвольный десятичный знак точности в C# и наткнулся на идею, размещенную здесь:https://stackoverflow.com/a/4524254/804614
затем я завершил проект для поддержки всех основных арифметических операторов и операторов сравнения, а также преобразования во все типичные числовые типы и несколько экспоненциальных методов, которые мне нужны в то время.
Это, конечно, не всеобъемлющий, но очень функциональный и почти готовый к использованию. Как это результат одного ночного кодирования, я не могу гарантировать, что эта вещь не содержит ошибок или полностью точна, но она отлично сработала для меня. Во всяком случае, я хочу опубликовать его здесь, потому что я не нашел другого способа использовать произвольные десятичные дроби точности в C# без необходимости включать массивные библиотеки (в основном даже не .net, а обертки для C++), которые поставляются со всеми видами ненужных вещей.
основная идея состоит в том, чтобы построить пользовательский тип с плавающей запятой с произвольной большой мантиссой, используя Тип BigInteger .NET 4.0 и базовый показатель 10 (Int32).
Если вы нашли ошибки / неточности, есть предложения или что-нибудь конструктивное, пожалуйста, не стесняйтесь непосредственно редактировать мой пост или Оставить комментарий, чтобы я мог улучшить ответ.
Я не совсем уверен, что это лучшее место для размещения этой вещи, но это один из главных вопросов по этой теме, и я действительно хочу поделиться своим решением. ;)
EDIT: я переместил реализацию в GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d
ну, кроме использования сторонних библиотек с поддержкой BigDecimal (если они существуют), нет простых обходных путей. Самый простой способ, насколько мне известно, - взять десятичную реализацию (например, из mono) и переписать ее с помощью типа BigInteger. Внутренне, в реализации mono, decimal type состоит из трех целых чисел. Поэтому я не думаю, что это будет трудно осуществить. Однако я не уверен в эффективности. Сначала следует рассмотреть, однако, используя стандартный десятичный тип, как codeka упоминается.
вот библиотека C#, которая делает то, что вы ищете, и в некоторых случаях имеет дополнительную функциональность:http://www.fractal-landscapes.co.uk/bigint.html (или попробуйте на http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html).
например, он имеет функцию квадратного корня, которая BigDecimal не имеет:
PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN);
BigFloat bf = new BigFloat(13, precision);
bf.Sqrt();
Console.WriteLine(bf.ToString());
Википедия имеет список других таких библиотек на http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries
это может быть не вариант, когда вопрос был первоначально опубликован, но один очень простой способ использовать BigDecimal
в C# код, чтобы установить IKVM.NET пакет через NuGet:
PM> Install-Package IKVM
затем сделайте точно так же, как в Java:
using System;
using java.math;
namespace BigDecimalDemo
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(args[0]);
Console.WriteLine(Factorial(n));
}
static BigDecimal Factorial(int n)
{
return n == 1
? BigDecimal.ONE
: Factorial(n - 1).multiply(new BigDecimal(n));
}
}
}
В зависимости от того, как далеко вы идете с IKVM, может быть случайная проблема взаимодействия, чтобы споткнуться, но по моему опыту она обычно отлично работает для простых вещей, таких как это.
Deveel Math
GitHub:
https://github.com/deveel/deveel-math
Автор GitHub:
поддержка:
- BigComplex
- BigDecimal
- BigMath
- рациональный
- ...
Как установить его
в консоли управления пакетами NuGet выберите проект где будет установлена библиотека и введите следующую команду
PM> Install-Package dmath