BigDecimal
- это класс в пакете java.math
, который имеет много преимуществ для обработки больших чисел определенного масштаба. Есть ли эквивалентный класс или тип данных в С# с этой функцией.
Что эквивалентно классу Java BigDecimal в С#?
Ответ 1
С# только имеет BigInteger
встроенный (в .NET framework 4).
Является ли decimal
достаточной точностью для вашей задачи? Это 128-битное число, которое может хранить значения в диапазоне ± 1,0 × 10 -28 до ± 7.9 × 10 28.
Ответ 2
Совсем недавно я также нуждался в произвольной точности десятичных чисел в С# и наткнулся на идею, размещенную здесь: fooobar.com/questions/138246/...
Затем я завершил проект, чтобы поддержать все основные операторы арифметики и сравнения, а также преобразования и из всех типичных числовых типов и несколько экспоненциальных методов, которые мне в то время нужны.
Это, безусловно, не является всеобъемлющим, но очень функциональным и почти готовым к использованию. Поскольку это результат одного ночного кодирования, я не могу гарантировать, что эта вещь является ошибкой или полностью точной, но она отлично поработала для меня. Во всяком случае, я хочу опубликовать его здесь, потому что я не нашел другого способа использовать произвольные десятичные значения точности в С# без необходимости включать массивные библиотеки (в основном даже не.net, а wrappers на c++), которые бывают всех видов ненужных вещей.
Основная идея заключается в создании пользовательского типа с плавающей запятой с произвольной большой мантиссой с использованием типа BigInteger.NET 4.0 и базового показателя 10 (Int32).
Если вы обнаружите ошибки/неточности, имеете предложения или что-либо конструктивное, пожалуйста, не стесняйтесь прямо редактировать мое сообщение или оставлять комментарий, чтобы я мог улучшить ответ.
Я не совсем уверен, что это лучшее место для размещения этой вещи, но это один из главных вопросов по этой теме, и я действительно хочу поделиться своим решением. ;)
EDIT: я переместил реализацию в GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d
Ответ 3
Ну, кроме использования сторонних библиотек с поддержкой BigDecimal (если они существуют), нет простых способов обхода. Самый простой способ, насколько мне известно, - выполнить десятичную реализацию (например, с моно) и переписать ее с помощью типа BigInteger. Внутренне, в моно реализации, десятичный тип состоит из трех целых чисел. Поэтому я не думаю, что это было бы трудно реализовать. Однако я не уверен в эффективности. Сначала вам следует рассмотреть возможность использования стандартного десятичного типа в качестве codeka.
Ответ 4
Здесь библиотека С#, которая делает то, что вы ищете, и в некоторых случаях имеет дополнительную функциональность: 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
Ответ 5
Возможно, это был не вариант, когда вопрос был первоначально отправлен, но один очень простой способ использовать BigDecimal
в коде С# - установить 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, может возникать случайная проблема взаимодействия, но, по моему опыту, она обычно отлично подходит для простых вещей, подобных этому.
Ответ 6
Девель Математика
GitHub:
https://github.com/deveel/deveel-math
Автор GitHub:
Поддержка:
- BigComplex
- BigDecimal
- BigMath
- Rational
- ...
Как установить его
В консоли управления пакетами NuGet выберите проект, в котором будет установлена библиотека, и введите следующую команду
PM> Install-Package dmath
Ответ 7
Вы также можете использовать пакет NuGet Math.Gmp.Native, который я написал. Его исходный код доступен на GitHub, а документация доступна здесь. Он предоставляет .NET всю функциональность библиотеки GMP, которая известна как высоко оптимизированная арифметическая библиотека произвольной точности.
Числа с плавающей точкой произвольной точности представлены типом mpf_t. Все операции над этими числами с плавающей точкой начинаются с префикса mpf_
. Например, mpf_add или mpf_cmp. Примеры исходного кода приведены для каждой операции.