Что такое эквивалент класса 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